【发布时间】:2015-05-28 09:10:48
【问题描述】:
似乎无法让简单的堆栈实现工作。我只是想让两个不同的类(B 类和 C 类)能够在由第三类(A 类)管理的 same 堆栈中推送和打印元素。
A.cpp
#include "A.h"
void A::pop() {}
void A::push() {}
void A::print() {} // prints last pushed elements
啊.h
#include < iostream >
class A
{
public:
void pop();
void push();
void print();
}
B.cpp
#include "B.h"
#include "A.h"
A a;
void B::Text() { a.push(); }
void B::Background() { a.print(); } // works!
C.cpp
#include "C.h"
#include "A.h"
A _a; // why doesn't A a work? because ODR?
void B::Text() { _a.push(); }
void B::Background() { _a.print(); } // doesn't work! breakpoint shows empty stack!
我认为我违反了单一定义规则。我说的对吗?
【问题讨论】:
-
如果在 C.pp 中我将 A 类定义为“A a”而不是“A _a”,则不会。其次,您知道为什么当我尝试访问 B 类中的堆栈时它是空的,即使我只是在该类中推送了一个元素。
-
你基本上是在谈论一个全局变量。所有常见的警告都适用(总结:不要这样做!!)。但是如果你只是必须这样做,那么决定哪个cpp文件应该是
a的规范“所有者”,在那里定义它,然后将extern A a放在头文件中。 -
@Daqs 只是为了准确:我已将 A 类定义为“A a” — 您已定义了一个
a类的 对象 987654328@. -
@Melebius 明白了!谢谢
-
@bolov:考虑到许多违反 ODR 的行为不需要被诊断出来,这是一个大胆的声明……例如 a.cpp:
inline int f() { return 1; }和 b.cpp:inline int f() { return 2; };将两者链接在一起违反了 ODR,但您的链接器可能无法诊断它们。
标签: c++ stack one-definition-rule