从另一个类(B类)函数调用一个类(A类)函数时遇到问题,在该函数中,我试图调用的类(A类)中构造在该类中的变量被删除完成并返回到我从(C类)调用的函数。发生了什么事,我该如何解决?
香港专业教育学院试图使用指向该类的指针,并动态分配整个类,但变量仍被删除。
#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;
class A {
private:
vector<string> vectorA;
string stringA[5] = { "1", "2", "3", "4", "5" };
string stringB[5] = { "6", "7", "8", "9" };
public:
string generaterandnum() {
int num1 = NULL;
num1 = rand() % vectorA.size();
string card = vectorA[num1];
vectorA.erase(vectorA.begin() + num1);
return card;
}
void buildvectorA()
{
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
vectorA.push_back(stringA[j] + stringB[i]);
}
}
return;
}
};
class B {
private:
vector<string> vectorB;
vector<string> vectorC;
A aobject;
public:
void buildvectorBandC() {
for (int i = 0; i < 5; i++) {
vectorB.push_back(aobject.generaterandnum());
}
for (int i = 0; i < 5; i++) {
vectorC.push_back(aobject.generaterandnum());
}
}
void displayvector() {
cout << "Vector: ";
for (size_t i = 0; i < vectorB.size(); i++) {
cout << "[" << vectorB[i] << "] (" << i << ") ";
}
cout << endl;
}
};
class C {
friend int main();
void programrun(int option) {
A* a = new A;
a->buildvectorA();
B* b = new B;
if (option == 0) {
cout << "Here is the vector that just has been constructed" << endl;
b->buildvectorBandC();
while (true) {
b->displayvector();
}
}
}
};
int main() {
srand((unsigned int)time(NULL));
cout << "Hello" << endl;
cout << "Enter (R) to run the program." << endl;
char input;
while (true) {
cin >> input;
input = toupper(input);
if (input == 'R') {
C cobject;
cobject.programrun(0);
return false;
}
else {
cout << "Invalid input" << endl;
}
}
}
我期望使用随机生成的数字构建矢量B和C,这些数字从vectorA中选取变量。但是我得到的是,当它生成generaterandnum()时,它显示一个错误,指出Project1.exe中0x00F1C77F的未处理异常:0xC0000094:整数除以零。因为vectorA的大小为0,因为在程序离开该类的作用域后已将其删除。
最佳答案
类成员的生存时间与您的类对象一样长。问题不在于对象的生存期,而在于B::aobject
从未被调用过buildvectorA
的事实,因此它的vectorA
为空,因此vectorA.size() == 0
。然后,您尝试计算rand() % vectorA.size()
,并且将0
除以(整数)是一个非常糟糕的主意。
您可能要为A
创建一个构造器,然后在其中调用generaterandnum
以确保它始终正确:
class A {
private:
vector<string> vectorA;
string stringA[5] = { "1", "2", "3", "4", "5" };
string stringB[5] = { "6", "7", "8", "9" };
void buildvectorA()
{
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
vectorA.push_back(stringA[j] + stringB[i]);
}
}
}
public:
A() {
buildvectorA();
}
string generaterandnum() {
int num1 = NULL;
num1 = rand() % vectorA.size();
string card = vectorA[num1];
vectorA.erase(vectorA.begin() + num1);
return card;
}
};
请注意,
buildvectorA
现在是私有方法。我们不希望任何人从外部调用它,因为他们不在乎随机数是如何生成的。他们只想获得那些随机数。这也意味着您的类
C
不需要调用buildvectorA
,实际上,它甚至不需要任何对象A
。