gpt4 book ai didi

c++ - 对象内部的对象和维护对象的一个​​实例时出现问题

转载 作者:行者123 更新时间:2023-11-27 23:43:28 25 4
gpt4 key购买 nike

在其他对象中传递对象实例时遇到一些问题。在主应用程序的末尾,我希望 iDogClassOne 和 iDogClassTwo 引用同一个对象,并且我希望该对象包含放置在 variableA 中的数字。我在这里做错了什么? tempDogClass、iDogClassOne 和 iDOgClassTwo 的地址都不同,所以我很确定我目前正在创建我不想做的狗类的 3 个实例......非常感谢任何帮助。

class dogClass{
public:
void setVariableA(std::vector<double> newNum) {
variableA.push_back(newNum);
}
void printVariableA() {
if (variableA.size() != 0) {
std::cout << variableA[0][0] << std::endl;
std::cout << variableA[0][1] << std::endl;
}
}
dogClass &dogClass::operator=(const dogClass &src) {
variableA = src.variableA;
return *this;
}
private:
std::vector<std::vector<double>> variableA;
};

class animalClass{
public:
void addNumberToDog(std::vector<double> num) {
dogClass tempDogClass;
getDogOne(tempDogClass);
tempDogClass.setVariableA(num);
std::cout << "Address of temp Dog: " << &tempDogClass << std::endl;
std::cout << "Variables in tempDog:\n";
tempDogClass.printVariableA();
std::cout << std::endl;
}
void getDogOne(dogClass &dogOne) {
dogOne = dogs[0];
}
void setDogOne(dogClass &dogOne) {
dogs.push_back(dogOne);
}
private:
std::vector<dogClass> dogs;
};


int main() {
animalClass iAnimalClass;
dogClass iDogClassOne;

iAnimalClass.setDogOne(iDogClassOne);

std::vector<double> newNum;
newNum.push_back(12);
newNum.push_back(15);

iAnimalClass.addNumberToDog(newNum);

dogClass iDogClassTwo;

iAnimalClass.getDogOne(iDogClassTwo);

//Why are these not equal. Also why does dog Two not contain the values in dog One?
std::cout << "Address of dog One: " << &iDogClassOne << std::endl;
std::cout << "Variables in dog One:\n";
iDogClassOne.printVariableA();
std::cout << std::endl;
std::cout << "Address of dog Two: " << &iDogClassTwo << std::endl;
std::cout << "Variables in dog Two:\n";
iDogClassTwo.printVariableA();
std::cout << std::endl;
return 0;

}

控制台应用程序的输出(为什么 iDogClassOne 和 iDogClassTwo 不包含数字?为什么 tempDog、iDogClassOne 和 iDogClassTwo 不是同一个对象?)

Address of temp Dog: 00000000002AF8A0
Variables in tempDog:
12
15

Address of dog One: 00000000002AF938
Variables in dog One:

Address of dog Two: 00000000002AF920
Variables in dog Two:

最佳答案

因为您要在许多地方复制 dogClass 对象。请考虑值、引用和指针的区别。例如,在 main() 函数中调用 iAnimalClass.setDogOne(iDogClassOne); 参数作为引用传递,没问题。但随后您将其复制到 vector 中。这有点棘手,因为您不能在 vector 中传递引用。在这种情况下,您将不得不使用指向 dogClass 的指针 vector 。

现在您已经有了 dogClass 的两个实例。一个在主函数中,另一个在 animalClass 的 vector 中。

下一个问题是在 main() 函数中实例化 iDogClassTwo

现在你有 dogClass 的三个实例。

然后调用 iAnimalClass.getDogOne(iDogClassTwo); 将狗从 vector 复制到主函数中的狗。

这是更正后的版本:

#include <vector>
#include <iostream>

class dogClass{
public:
void setVariableA(std::vector<double> newNum) {
variableA.push_back(newNum);
}
void printVariableA() {
if (variableA.size() != 0) {
std::cout << variableA[0][0] << std::endl;
std::cout << variableA[0][1] << std::endl;
}
}
dogClass & operator=(const dogClass &src) {
variableA = src.variableA;
return *this;
}
private:
std::vector<std::vector<double>> variableA;
};

class animalClass{
public:
void addNumberToDog(std::vector<double> num) {
dogClass& tempDogClass = getDogOne();
tempDogClass.setVariableA(num);
std::cout << "Address of temp Dog: " << &tempDogClass << std::endl;
std::cout << "Variables in tempDog:\n";
tempDogClass.printVariableA();
std::cout << std::endl;
}
dogClass& getDogOne() {
return *dogs[0];
}
void setDogOne(dogClass &dogOne) {
dogs.push_back(&dogOne);
}
private:
std::vector<dogClass*> dogs;
};


int main() {
animalClass iAnimalClass;
dogClass iDogClassOne;

iAnimalClass.setDogOne(iDogClassOne);

std::vector<double> newNum;
newNum.push_back(12);
newNum.push_back(15);

iAnimalClass.addNumberToDog(newNum);

dogClass& iDogClassTwo = iAnimalClass.getDogOne();

//Why are these not equal. Also why does dog Two not contain the values in dog One?
std::cout << "Address of dog One: " << &iDogClassOne << std::endl;
std::cout << "Variables in dog One:\n";
iDogClassOne.printVariableA();
std::cout << std::endl;
std::cout << "Address of dog Two: " << &iDogClassTwo << std::endl;
std::cout << "Variables in dog Two:\n";
iDogClassTwo.printVariableA();
std::cout << std::endl;
return 0;

}

关于c++ - 对象内部的对象和维护对象的一个​​实例时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572264/

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