Проблемы с объектами внутри объектов и поддержание одного экземпляра объекта - PullRequest
0 голосов
/ 29 сентября 2018

Возникли проблемы с передачей объектов в другие объекты.В конце основного приложения я хочу, чтобы iDogClassOne и iDogClassTwo ссылались на один и тот же объект, и я хочу, чтобы этот объект содержал числа, которые были помещены в переменную A.Что я здесь не так делаю?Адреса tempDogClass, iDogClassOne и iDOgClassTwo все разные, поэтому я уверен, что в настоящее время я создаю 3 экземпляра класса dog, которые я не хочу делать ... Любая помощь будет принята с благодарностью.

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:

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Потому что вы делаете копии 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;

}
0 голосов
/ 29 сентября 2018

почему 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...