gpt4 book ai didi

c++ - 类变量在离开范围后会自动删除,我该如何防止这种情况发生?

转载 作者:行者123 更新时间:2023-11-28 04:19:03 30 4
gpt4 key购买 nike

我在从另一个类(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;
}
}
}

我希望用随机生成的数字构建 vector B 和 C,这些数字从 vector A 中挑选变量。但我得到的是当它到达 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 现在是私有(private)方法。我们不希望外面的任何人调用它,因为他们不关心随机数是如何生成的。他们只是想得到那些随机数。

这也意味着你的类 C 不需要调用 buildvectorA,事实上,它甚至不需要有任何对象 A

关于c++ - 类变量在离开范围后会自动删除,我该如何防止这种情况发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882581/

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