【问题标题】:C++ class member variables reassignmentC++ 类成员变量重新赋值
【发布时间】:2015-04-28 01:39:49
【问题描述】:

这个程序


我的对象Class 有一个成员变量balance,它在初始化期间设置并通过augment 方法进行操作,该方法给balance 添加一个double。

Class 对象嵌套在 Class2 对象的一个​​数组中,该对象只有 Class 对象数组作为其成员。 Class2 对象具有访问 Class 对象的方法,称为 getClass 和操作 Class 对象的方法,称为 setObject


#include <iostream>

using namespace std;

class Class {
    double balance;
public:
    Class();
    Class(double setBalance);
    void augment(double amount);
    double getBalance();
};

class Class2 {
    Class object2[50];
public:
    Class getClass(int index){
        return object2[index];
    };
    void setObject(int index, double balance) {
        Class temp(balance);
        object2[index]=temp;
    };
};

Class::Class() {
    balance = 0;
}

Class::Class(double setBalance){
    balance=setBalance;
};

void Class::augment(double amount) {
    balance+=amount;
};

double Class::getBalance() {
    return balance;
};

int main() {
    Class2 object;
    object.setObject(5, 546);
    cout << object.getClass(5).getBalance();
    object.getClass(5).augment(546);
    cout << object.getClass(5).getBalance();
    return 0;
}



问题


如果您遵循main 中的过程,我将尝试使用balance 初始化Class 对象并通过augment 方法操作balance。看起来这段代码应该可以工作,如果直接访问对象而不是嵌套在Class2 中,它确实可以工作,但这不是一个选项。我认为这与Class 对象在Class2 中返回的方式有关,但我无法弄清楚。

【问题讨论】:

  • 您正在使用隐式复制操作,因此您的代码正在创建 Class 实例的副本,修改其状态(即 balance),然后丢弃结果。而是使用指向单个 Class 实例的指针或引用。
  • 具体来说你应该有一个Class&amp; getClass(int);const Class&amp; getClass(int) const;
  • @Dai 这总是的问题...但是当我进行更改以尝试返回 Class 作为参考时,我得到了很多 red .
  • @cltco const Class&amp; getClass(int) const; 能为我做什么?
  • “红色”是什么意思?如果您收到编译器错误消息,请发布它们,而不是模糊和不具体。

标签: c++ function class object methods


【解决方案1】:

返回对数组中对象的引用

Class & getClass(int index){
    return object2[index];
};

您可以在 Class2 中定义下标运算符来访问数组的元素。

还要考虑到使用类名 Class 和 Class2 是一个坏主意。

【讨论】:

  • 这只是一个重现问题的示例程序...我没有名为 ClassClass2 的类
  • @henryaaron 您可以将限定符 const 与类的某些功能一起使用。
【解决方案2】:

看起来我有点晚了,但我的两分钱将是重载赋值运算符并创建一个复制构造函数,以确保您的类被正确复制和分配。它可能有点过时,但我喜欢遵循三法则。 http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29

#include <iostream>
#include <cassert>

class Class1 {
    private:
        double balance;

    public:
        Class1() : balance(0) { };

        Class1(double setBalance) :
            balance(setBalance) { }

        // create a copy constructor
        Class1(const Class1& src) : balance(src.balance) { }

        // destructor that does nothing
        ~Class1() { }

        void augment(double amount) {
            balance += amount;
        }

        double getBalance() { return(balance); }

        // overload the assignment operator for your class
        Class1& operator=(const Class1 &src) {
            balance = src.balance;
            // make sure to return *this which returns a reference to the
            // current class object (in this case, the current Class1)
            return(*this);
        }
};

class Class2 {
    private:
        Class1 object2[50];

    public:
        Class2 () = default;

        Class1 getClass(unsigned index) {
            assert(index < 50);
            return(object2[index]);
        }

        void setObject(int index, double balance) {
            assert(index < 50);
            object2[index] = Class1(balance);
        }
};

int main(int argc, char *argv[]) {
    Class2 object;
    object.setObject(5, 546);
    std::cout << object.getClass(5).getBalance() << std::endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多