【问题标题】:Trouble with objects inside of objects and maintaining one instance of an object对象内部的对象和维护对象的一个​​实例的问题
【发布时间】:2018-09-29 20:23:26
【问题描述】:

在其他对象中传递对象实例时遇到一些麻烦。在主应用程序的最后,我希望 iDogClassOne 和 iDogClassTwo 引用同一个对象,并且我希望该对象包含放置在变量 A 中的数字。我在这里做错了什么? 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:

【问题讨论】:

  • 您正在向 tempDog 实例添加数字,而不是为 dogOne 和 DogTwo 实例添加数字

标签: c++ object vector


【解决方案1】:

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

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

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

现在您有三个 dogClass 实例。

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

这里是更正的版本:

#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;

}

【讨论】:

  • 这很有帮助。非常感谢您花时间提供帮助。它现在有效,并且使我所犯的错误变得有意义。
【解决方案2】:

为什么 iDogClassOne 和 iDogClassTwo 不包含数字?

int main()
{
    animalClass iAnimalClass;
    dogClass iDogClassOne;

    iAnimalClass.setDogOne(iDogClassOne);  // pushes a copy of iDogClassOne 
                                           // into a vector animalClass::dogs

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

    iAnimalClass.addNumberToDog(newNum);  // Only operates on function local variable
                                          // variable tempDogClass without having
                                          // any effect on the outside world.

    dogClass iDogClassTwo;

    iAnimalClass.getDogOne(iDogClassTwo); // copies the copy of iDogClassOne earlier pushed 
                                          // into the vector animalClass::dogs to iDogClassTwo

    std::cout << "Address of dog One: " << &iDogClassOne << std::endl;
    std::cout << "Variables in dog One:\n";
    iDogClassOne.printVariableA();
    std::cout << "\nAddress of dog Two: " << &iDogClassTwo << std::endl;
    std::cout << "Variables in dog Two:\n";
    iDogClassTwo.printVariableA();
}

为什么 tempDog、iDogClassOne 和 iDogClassTwo 不是同一个对象?

为什么下面的例子中a、b、c不是同一个对象?

void func()
{
    int c;
}

int main()
{
    int a;
    int b;
    func();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多