C++ 如何更改向量中的类成员值 #包括 #包括 使用名称空间std; 类所有者{ 受保护的: 字符串所有者名称; 国际收支平衡; int numPetsCheckin; 线宠物[100]; 公众: 所有者(); 所有者(常量字符串和所有者名称,整数余额); 字符串getOwnerName(){return ownerName;} int getBalance(){return balance;} int getNumPetsCheckin(){return numPetsCheckin;} void pushListPet(字符串a){ pet[numPetsCheckin]=a; numPetsCheckin++; //cout

C++ 如何更改向量中的类成员值 #包括 #包括 使用名称空间std; 类所有者{ 受保护的: 字符串所有者名称; 国际收支平衡; int numPetsCheckin; 线宠物[100]; 公众: 所有者(); 所有者(常量字符串和所有者名称,整数余额); 字符串getOwnerName(){return ownerName;} int getBalance(){return balance;} int getNumPetsCheckin(){return numPetsCheckin;} void pushListPet(字符串a){ pet[numPetsCheckin]=a; numPetsCheckin++; //cout,c++,C++,正如人们在评论中解释的那样,代表A和所有者[0]的字节是不同的。可以存储指向同一内存的指针,但通常目的只是存储在一些连续内存中并访问其中的特定点 考虑将A和B作为引用(在某些情况下编译器可能将其实现为指针),而不是生成指针数组 #include <iostream> #include <string> using namespace std; class Owner{ protected: string ownerName; i

正如人们在评论中解释的那样,代表A和所有者[0]的字节是不同的。可以存储指向同一内存的指针,但通常目的只是存储在一些连续内存中并访问其中的特定点

考虑将A和B作为引用(在某些情况下编译器可能将其实现为指针),而不是生成指针数组

#include <iostream>
#include <string>

using namespace std;

class Owner{
    protected:
        string ownerName;
        int balance;
        int numPetsCheckin;
        string pet[100];

    public:
        Owner();
        Owner(const string& ownerName, int balance);
        string getOwnerName(){return ownerName;}
        int getBalance(){return balance;}
        int getNumPetsCheckin(){return numPetsCheckin;}
     
        void pushListPet(string a){
            pet[numPetsCheckin] = a;
            numPetsCheckin++;
            //cout << numPetsCheckin;
        }
        void showOwners(){
            cout << "Owners { name: " << ownerName << ", balance: " << balance << ", numPetsCheckin: " << numPetsCheckin << "}\n";
        }

};

Owner:: Owner()
    : ownerName("No name"), balance(0), numPetsCheckin(0){}
Owner:: Owner(const string& theName, int theBalance)
    : ownerName(theName), balance(theBalance), numPetsCheckin(0){}


int main(){
    int people = 0;
    Owner owner[100]; 

    Owner A( "A", 10); 
    owner[people] = A;
    people++;
    
    Owner B("B", 20);
    owner[people] = B;
    people++;
    A.showOwners();
    A.pushListPet("momo");
    A.showOwners();

    cout << "owner[0].getOwnerName: " << owner[0].getOwnerName() << endl;
    cout << "owner[0].getNumPetsCheckin: " << owner[0].getNumPetsCheckin() << endl;
    cout << "A.getNumPetsCheckin: " << A.getNumPetsCheckin() << endl;
}


Owners { name: A, balance: 10, numPetsCheckin: 0}
Owners { name: A, balance: 10, numPetsCheckin: 1}
owner[0].getOwnerName: A 
owner[0].getNumPetsCheckin: 0
A.getNumPetsCheckin: 1

正如人们在评论中解释的那样,代表A和所有者[0]的字节是不同的。可以存储指向同一内存的指针,但通常目的只是存储在一些连续内存中并访问其中的特定点

考虑将A和B作为引用(在某些情况下编译器可能将其实现为指针),而不是生成指针数组

#include <iostream>
#include <string>

using namespace std;

class Owner{
    protected:
        string ownerName;
        int balance;
        int numPetsCheckin;
        string pet[100];

    public:
        Owner();
        Owner(const string& ownerName, int balance);
        string getOwnerName(){return ownerName;}
        int getBalance(){return balance;}
        int getNumPetsCheckin(){return numPetsCheckin;}
     
        void pushListPet(string a){
            pet[numPetsCheckin] = a;
            numPetsCheckin++;
            //cout << numPetsCheckin;
        }
        void showOwners(){
            cout << "Owners { name: " << ownerName << ", balance: " << balance << ", numPetsCheckin: " << numPetsCheckin << "}\n";
        }

};

Owner:: Owner()
    : ownerName("No name"), balance(0), numPetsCheckin(0){}
Owner:: Owner(const string& theName, int theBalance)
    : ownerName(theName), balance(theBalance), numPetsCheckin(0){}


int main(){
    int people = 0;
    Owner owner[100]; 

    Owner A( "A", 10); 
    owner[people] = A;
    people++;
    
    Owner B("B", 20);
    owner[people] = B;
    people++;
    A.showOwners();
    A.pushListPet("momo");
    A.showOwners();

    cout << "owner[0].getOwnerName: " << owner[0].getOwnerName() << endl;
    cout << "owner[0].getNumPetsCheckin: " << owner[0].getNumPetsCheckin() << endl;
    cout << "A.getNumPetsCheckin: " << A.getNumPetsCheckin() << endl;
}


Owners { name: A, balance: 10, numPetsCheckin: 0}
Owners { name: A, balance: 10, numPetsCheckin: 1}
owner[0].getOwnerName: A 
owner[0].getNumPetsCheckin: 0
A.getNumPetsCheckin: 1

问:为什么所有者[0].getNumPetsCheckin()和A.getNumPetsCheckin()不同


它们是不同的对象,在状态
owner[people]=A;
之后,对象
A
被复制到
owner[people]
中。您可以使用打印地址验证:


std::coutQ:为什么所有者[0].getNumPetsCheckin()和A.getNumPetsCheckin()不同


它们是不同的对象,在状态
owner[people]=A;
之后,对象
A
被复制到
owner[people]
中。您可以使用打印地址验证:


std::cout
vector
s存储你放入其中的内容的副本。大多数情况下,这是正确的选择,但偶尔你需要一个
vector
指针,这样你就可以共享一个对象。大多数代码都是不必要的;你可以将它减少到六行。我可以猜测发生了什么,但我确实这样做了C++ C++不是java或C语言,它们不一样,你希望C++中的对象像java或C语言那样工作,但是它们不这样。C++中的对象工作方式有根本不同。数组中的一个值,该对象将被复制,而不是通过原始离散对象或通过其在数组中的位置访问同一对象。现在有两个完全独立的对象。您可以通过学习如何使用智能指针和使用智能指针来解决此问题。
vector
s存储您放入其中的内容的副本。大多数当然,这是一个正确的选择,但有时你需要一个
向量
,这样你就可以共享一个对象。大多数代码都是不必要的;你可以把它减少到半打行。我可以猜测发生了什么,但我不想筛选所有这些代码来确认。它们是不同的因为C++不是java或C++,你希望C++中的对象像java或C语言那样工作,但是C++中的对象工作方式却有根本不同。当你把一个对象分配给C++中的另一个对象——并且包括把一个离散对象分配给数组中的一个值时,对象就被复制而不是同一个对象ACCE。作为原始离散对象或通过其在数组中的位置。您现在有两个完全独立的对象。您可以通过学习如何使用智能指针和使用智能指针来解决它。我解决了它!谢谢您!非常感谢
0x7ffd10410f90 0x7ffd1040f530