【问题标题】:c++ operator overloading. Function to get private value from overloadc++ 运算符重载。从重载中获取私有值的函数
【发布时间】:2013-10-02 03:44:43
【问题描述】:

我无法在此类中使用“打印”函数来获得正确的总数

class PRN {
private:
typedef pair < string, int > P;   
int sz, // map size – no of distinct words
cnt, // counter for printing
total; // no of words
public:
// constructor
PRN ( const int& s = 1, const int& c = 0, const int& t = 0 ){
    cnt= c;
    total = t;
        sz = s;        
}
void operator ( ) ( const P& p ){
    total += p.second;
    cout << total;
}// overloaded operator, where P is defined as
// typedef pair < string, int > P;

void print () const{
    cout <<"no of words in output list : " << total << endl;
}

};

然后在我的主要调用中

PRN p (m.size());
    for_each(m.begin(),m.end(),p);
    p.print();

m 是一个包含一些值的映射(string, int); 操作员正在添加,因为我正在打印它们,我可以看到它们正在被添加,但是当我调用 p.print() 时,它为“总数”返回零。

有什么建议吗? 谢谢

【问题讨论】:

  • 您的代码是我不愿使用运算符重载的一个示例。目前尚不清楚操作员对您的班级做了什么。请改用标题良好的函数名。

标签: c++ operator-overloading overloading


【解决方案1】:

问题在于for_each 的行为——标准不保证for_each 在工作时不会在内部复制p。因此,像这样具有状态的类函数对象通常不能很好地与标准库函数一起使用。就个人而言,我一直认为这种行为很奇怪,并且破坏了拥有类似函数的对象的很多意义,但这就是我们遇到的问题。

根据您使用它的方式,您可以通过使total 成为PRN 的静态成员,或多或少地获得您想要的行为,因此只有一个total 值所有PRN 对象使用的任何地方。一个缺点是下一个for_each 会从你离开的地方开始,而不是从头开始,但你可以通过让PRN 构造函数将total 重置为零(假设PRN 对象的寿命不会很长,并且在非常靠近它们使用的地方创建)。

另一种可能性是让PRN 对象包含指向另一个实际包含总数的对象的指针,如下所示:

class PRN
{
private:
    struct Storage
    {
        int total;
    };

    Storage *s;
public:
    PRN():
        s(new Storage)
    {
    }

    ~PRN()
    {
        delete s;
    }

    void operator()(const P& p)
    {
        s->total += p.second;
        ...
    }

    ...
};

使用这种方法,for_each 是否复制 p 无关紧要,因为副本将指向与原始对象相同的 Storage 对象。

【讨论】:

  • 我做了一个静态int,编译时出现了一些错误。对“PRN::total”的未定义引用
  • 是说未定义的引用在您显示的代码中,还是在其他地方?我没有看到任何会导致问题的东西,但是如果您能给我更多信息,我可能会提供帮助。我还添加了您可能更喜欢的第二种可能的解决方案。
  • @AndreEscudero:如果你声明一个static成员,你必须定义在@987654337之外 @声明:int PRN::number_of_words;
  • @Johnsyweb 是的,当然,我应该记住这一点。谢谢你提醒我。
  • @Johnsyweb 谢谢。这解决了问题。嗯,这是一个硬件分配和使用类 PRN 的方向。该课程已经完成,我只需要使用正确的东西来实现,并且总数不是静态的。但它似乎确实可以通过使 total 成为静态成员来工作。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
相关资源
最近更新 更多