在多个 类 中实现堆栈时的一个定义规则 (ODR)
One Definition Rule (ODR) when implementing stack in multiple classes
似乎无法使简单的堆栈实现正常工作。我只是想获得两个不同的 classes (class B & class C) 以便能够在 same[=28= 中推送和打印元素] 堆栈由第三个 class (class A).
管理
A.cpp
#include "A.h"
void A::pop() {}
void A::push() {}
void A::print() {} // prints last pushed elements
A.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.cpp.
中使用 extern A a
通过在 B.cpp 中创建 A a
并在 C.cpp 中创建 A a
,您实际上有 2 个不同的对象,它们不会指向同一个堆栈。
实现相同目标的另一种方法是将 A
作为单例对象。
似乎无法使简单的堆栈实现正常工作。我只是想获得两个不同的 classes (class B & class C) 以便能够在 same[=28= 中推送和打印元素] 堆栈由第三个 class (class A).
管理A.cpp
#include "A.h"
void A::pop() {}
void A::push() {}
void A::print() {} // prints last pushed elements
A.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.cpp.
中使用extern A a
通过在 B.cpp 中创建 A a
并在 C.cpp 中创建 A a
,您实际上有 2 个不同的对象,它们不会指向同一个堆栈。
实现相同目标的另一种方法是将 A
作为单例对象。