0x0*_*x01 0 c++ constructor pointers vector
我是新手复制构造函数,当我开始使用向量时似乎无法让它们工作.
// ROBOT CLASS
class Robot {
private:
char *name;
int size;
int cmdCount;
command *cmdList;
char items[8][16];
int resources[3]; // silver, gold, then platinum
public:
Robot( );
Robot(int num_of_cmds, const char *nm);
Robot(const Robot &);
~Robot( );
const char *get_name( );
command get_command(int pos) const;
void set_item(const char item[ ], int pos);
const char *get_item(int pos);
};
// ROBOT CONSTRUCTOR default
Robot::Robot( ) {
// Load Robot name
cmdCount = 5;
try {
name = new char[11];
}
catch(std::bad_alloc) {
cout << "Error allocating " << 11+1 << " bytes of memory\n";
name = NULL;
}
if (name) {
strcpy (name, "univac.dat");
}
// Allocate memory for command array
vector <command> cmdList[5];
};
// ROBOT COPY CONSTRUCTOR
Robot::Robot(const Robot &from) {
cmdCount = from.cmdCount;
// Load Robot name
try {
name = new char[11];
}
catch(std::bad_alloc) {
cout << "Error allocating " << 11+1 << " bytes of memory\n";
name = NULL;
}
if (name) {
strcpy (name, from.name);
}
// Allocate memory for command array
vector <command> cmdList[5];
for (int i=0; i < cmdCount;i++) {
cmdList[i] = from.cmdList[i];
}
for (int i=0; i < 8; i++) {
strcpy(items[i], from.items[i]);
}
for (int i=0; i < 3; i++) {
resources[i] = from.resources[i];
}
}
Run Code Online (Sandbox Code Playgroud)
编译时得到的错误是:
robot.cpp:在复制构造函数'Robot :: Robot(const Robot&)'中:robot.cpp:117:错误:'cmdList [i]中没有匹配'operator ='= (((命令)from-> Robot: :cmdList)+((unsigned int)(((unsigned int)i)*172u)))'/ usr /include/c++/4.4/bits/vector.tcc:156:注意:候选者是:std :: vector < _Tp,_Alloc>&std :: vector <_Tp,_Alloc> :: operator =(const std :: vector <_Tp,_Alloc>&)[with _Tp = command,_Alloc = std :: allocator]
我如何在复制构造函数中复制矢量数组?
在您的类中,您声明一个成员变量:
command *cmdList;
Run Code Online (Sandbox Code Playgroud)
但是在每个构造函数中,都声明了一个具有相同名称的局部变量:
vector <command> cmdList[5];
Run Code Online (Sandbox Code Playgroud)
实际上,您需要成员变量的类型为vector<command>:
// ROBOT CLASS
class Robot {
private:
…
std::vector<command> cmdList;
…
};
Run Code Online (Sandbox Code Playgroud)
然后,在默认构造函数中,您可以为其分配内存.您不一定要这样做,具体取决于您以后如何使用它.
// ROBOT CONSTRUCTOR default
Robot::Robot( ) :cmdList(5) {
… // no mention of cmdList in the body required
};
Run Code Online (Sandbox Code Playgroud)
最后,在复制构造函数中,复制它:
// ROBOT COPY CONSTRUCTOR
Robot::Robot(const Robot &from) : cmdList(from.cmdList) {
… // no mention of cmdList in the body required
}
Run Code Online (Sandbox Code Playgroud)
Robot::Robot() {
…
cmdList = std::vector<command>(5);
// or cmdList.resize(5);
…
}
Robot::Robot(const Robot &from) {
…
cmdList = from.cmdList;
…
}
Run Code Online (Sandbox Code Playgroud)
class Robot {
private:
std::string name;
int size;
int cmdCount;
std::vector<command> cmdList;
char items[8][16];
int resources[3]; // silver, gold, then platinum
public:
Robot( );
Robot(int num_of_cmds, const char *nm);
const char *get_name( ) { return name.c_str(); }
command get_command(int pos) const { return cmdList[pos]; }
void set_item(const char item[ ], int pos);
const char *get_item(int pos);
};
Run Code Online (Sandbox Code Playgroud)