【问题标题】:Modifying an object also modifies all other objects of the same class修改一个对象也会修改同一类的所有其他对象
【发布时间】:2019-07-23 10:33:25
【问题描述】:

自从我上一个 c++ 项目以来已经很久了,现在我遇到了一个非常简单的问题。我创建了两个对象,并且只想修改其中一个。现在我不明白为什么另一个对象也被修改了......

主类:

#include "testobject.h"
#include <iostream>

int main() {
    TestObject o1;
    TestObject o2;

    std::cout << "object1 before: " << o1.getI() << std::endl;
    std::cout << "object2 before: " << o2.getI() << std::endl;

    o1.setI(2);

    std::cout << "object1 after: " << o1.getI() << std::endl;
    std::cout << "object2 after: " << o2.getI() << std::endl;

}

测试对象类:

#include "testobject.h"

int i;

int TestObject::getI() {
    return i;
}

void TestObject::setI(int j) {
    i = j;
}

输出是:

object1 before: 0
object2 before: 0
object1 after: 2
object2 after: 2

为什么 object2 中的 i 也设置为 2?

【问题讨论】:

  • 什么是testobject.h
  • 因为int i 是在全局范围内而不是在类范围内,如果iTestObject 的成员,那么这2 个TestObject 对象将有自己的成员
  • i 是全局对象吗?
  • i 不是任何对象的成员。它是全球性的。你的问题是建立在谎言之上的。
  • 因为int i; 是一个全局变量。成为会员class TestObject {public: int getI() const { return i_}; void setI(const int i) { i_ = i;} private: int i_;};

标签: c++ class variables scope datamember


【解决方案1】:

两个对象都引用公共变量

int i;

在全局命名空间中声明。所以一旦变量改变了类方法

int TestObject::getI() {
    return i;
}

将为两个对象返回相同的变量 i 值。

使变量成为类的数据成员。

例如

class TestObject
{
    //...
private:
    int i;
};

注意成员函数getI应该用限定符const声明,因为它不会改变对象本身

class TestObject
{
public:
    int getI() const {
        return i;
    }
//...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多