gpt4 book ai didi

c++ - 需要复制构造函数的帮助以实现单链表的非常基本的实现

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:36 25 4
gpt4 key购买 nike

上周,我们创建了一个使用类和 vector 管理字符串集的程序。我能够 100% 完成这件事。这周,我们必须用简单的单链表替换我们用来存储类中字符串的 vector 。

该函数基本上允许用户声明空字符串集,以及只有一个元素的集。在主文件中,有一个 vector ,其元素是一个包含 setName 和 strSet(类)的结构。

这是我的问题:它处理类的复制构造函数。当我删除/注释掉复制构造函数时,我可以根据需要声明任意数量的空集或单个集,并毫无问题地输出它们的值。但我知道当我实现程序的其余部分时,我显然需要复制构造函数。当我保留复制构造函数时,我可以声明一个集合(单个集合或空集合)并输出它的值。但是,如果我声明第二个集合,并尝试输出前两个集合中的任何一个,则会出现段错误。此外,如果我尝试声明超过 2 个集合,我会得到一个段错误。任何帮助将不胜感激!!

这是我的代码,用于对所有内容进行非常基本的实现:

这是 setcalc.cpp:(主文件)

#include <iostream>
#include <cctype>
#include <cstring>
#include <string>
#include "strset2.h"

using namespace std;

// Declares of structure to hold all the sets defined
struct setsOfStr {
string nameOfSet;
strSet stringSet;
};

// Checks if the set name inputted is unique
bool isSetNameUnique( vector<setsOfStr> strSetArr, string setName) {
for(unsigned int i = 0; i < strSetArr.size(); i++) {
if( strSetArr[i].nameOfSet == setName ) {
return false;
}
}
return true;
}

int main() {
char commandChoice;
// Declares a vector with our declared structure as the type
vector<setsOfStr> strSetVec;

string setName;
string singleEle;
// Sets a loop that will constantly ask for a command until 'q' is typed
while (1) {
cin >> commandChoice;
// declaring a set to be empty
if(commandChoice == 'd') {
cin >> setName;
// Check that the set name inputted is unique
if (isSetNameUnique(strSetVec, setName) == true) {
strSet emptyStrSet;
setsOfStr set1;
set1.nameOfSet = setName;
set1.stringSet = emptyStrSet;
strSetVec.push_back(set1);
}
else {
cerr << "ERROR: Re-declaration of set '" << setName << "'\n";
}
}
// declaring a set to be a singleton
else if(commandChoice == 's') {
cin >> setName;
cin >> singleEle;
// Check that the set name inputted is unique
if (isSetNameUnique(strSetVec, setName) == true) {
strSet singleStrSet(singleEle);
setsOfStr set2;
set2.nameOfSet = setName;
set2.stringSet = singleStrSet;
strSetVec.push_back(set2);
}
else {
cerr << "ERROR: Re-declaration of set '" << setName << "'\n";
}
}
// using the output function
else if(commandChoice == 'o') {
cin >> setName;
if(isSetNameUnique(strSetVec, setName) == false) {
// loop through until the set name is matched and call output on its strSet
for(unsigned int k = 0; k < strSetVec.size(); k++) {
if( strSetVec[k].nameOfSet == setName ) {
(strSetVec[k].stringSet).output();
}
}
}
else {
cerr << "ERROR: No such set '" << setName << "'\n";
}
}
// quitting
else if(commandChoice == 'q') {
break;
}
else {
cerr << "ERROR: Ignoring bad command: '" << commandChoice << "'\n";
}
}
return 0;
}

这是 strSet2.h:

#ifndef _STRSET_
#define _STRSET_

#include <iostream>
#include <vector>
#include <string>

struct node {
std::string s1;
node * next;
};

class strSet {

private:
node * first;
public:
strSet (); // Create empty set
strSet (std::string s); // Create singleton set
strSet (const strSet &copy); // Copy constructor
// will implement destructor and overloaded assignment operator later

void output() const;


}; // End of strSet class

#endif // _STRSET_

这里是 strSet2.cpp(类的实现)

#include <iostream>
#include <vector>
#include <string>
#include "strset2.h"

using namespace std;

strSet::strSet() {
first = NULL;
}

strSet::strSet(string s) {
node *temp;
temp = new node;
temp->s1 = s;
temp->next = NULL;
first = temp;
}

strSet::strSet(const strSet& copy) {
cout << "copy-cst\n";
node *n = copy.first;
node *prev = NULL;
while (n) {
node *newNode = new node;
newNode->s1 = n->s1;
newNode->next = NULL;
if (prev) {
prev->next = newNode;
}
else {
first = newNode;
}
prev = newNode;
n = n->next;
}
}

void strSet::output() const {
if(first == NULL) {
cout << "Empty set\n";
}
else {
node *temp;
temp = first;
while(1) {
cout << temp->s1 << endl;
if(temp->next == NULL) break;
temp = temp->next;
}
}
}

最佳答案

C++ 标准规定标准容器中使用的类型(例如 std::vector)必须是可复制构造和可赋值的。

由于您尚未在类 strSet 上实现自定义赋值运算符,编译器将为您生成一个执行简单的成员复制的运算符。在您的情况下,这意味着将直接复制“第一个”指针。显然,这意味着两个对象现在“拥有”集合中的节点,并且当它被释放两次时您会遇到崩溃。

一些提示:

  1. 实现自定义赋值运算符,其作用与复制构造函数相同

  2. 阅读有关通过引用传递对象的内容,并在可能的情况下通过 const 引用。当您按值传递时,您正在对容器和字符串进行大量不必要的复制。

例如

bool isSetNameUnique(const vector& strSetArr, const string& setName)

祝你好运:)

关于c++ - 需要复制构造函数的帮助以实现单链表的非常基本的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5319531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com