我正在寻找允许在另一个类的头文件中进行类的前向声明的定义:
我是否允许为基类,作为成员持有的类,通过引用传递给成员函数的类等执行此操作?
在声明模板时,我习惯使用这种代码:
template <class T>
Run Code Online (Sandbox Code Playgroud)
但在这个问题中,他们使用了:
template <unsigned int N>
Run Code Online (Sandbox Code Playgroud)
我查看它编译.但是这是什么意思?它是非类型参数吗?如果是这样,我们怎么能有一个没有任何类型参数的模板?
我有一个B包含一组构造函数和赋值运算符的类.
这里是:
class B
{
public:
B();
B(const string& s);
B(const B& b) { (*this) = b; }
B& operator=(const B & b);
private:
virtual void foo();
// and other private member variables and functions
};
Run Code Online (Sandbox Code Playgroud)
我想创建一个D只覆盖函数的继承类,foo()不需要进行其他更改.
但是,我希望D拥有相同的构造函数集,包括复制构造函数和赋值运算符B:
D(const D& d) { (*this) = d; }
D& operator=(const D& d);
Run Code Online (Sandbox Code Playgroud)
我是否必须重写所有这些D,或者有没有办法使用B的构造函数和运算符?我特别想避免重写赋值运算符,因为它必须访问所有B的私有成员变量.
我有一个具有相同名称的函数,但在基类和派生类中具有不同的签名.当我尝试在继承自派生的另一个类中使用基类的函数时,我收到一个错误.请参阅以下代码:
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
Run Code Online (Sandbox Code Playgroud)
我从gcc编译器收到以下错误:
In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: int B::foo(int)
Run Code Online (Sandbox Code Playgroud)
如果我int foo(int i){};从课堂上删除B,或者我将其重命名foo1,一切正常.
这有什么问题?
我不确定初始化shared_ptr一个类的成员的好方法.你能告诉我,我选择的方式是否C::foo()合适,还是有更好的解决方案?
class A
{
public:
A();
};
class B
{
public:
B(A* pa);
};
class C
{
boost::shared_ptr<A> mA;
boost::shared_ptr<B> mB;
void foo();
};
void C::foo()
{
A* pa = new A;
mA = boost::shared_ptr<A>(pa);
B* pB = new B(pa);
mB = boost::shared_ptr<B>(pb);
}
Run Code Online (Sandbox Code Playgroud) 何时使用Factory方法模式?
请提供一些具体的想法何时在项目中使用它?以及它如何比新关键字更好的方式?
今天,在我的C++多平台代码中,我对每个函数都进行了尝试.在每个catch块中,我将当前函数的名称添加到异常并再次抛出,以便在最上面的catch块(我最终打印异常的详细信息)中,我有完整的调用堆栈,这有助于我跟踪异常的原因.
这是一个好习惯,还是有更好的方法来获取异常的调用堆栈?
当我设计类并且必须在继承和组合之间进行选择时,我通常使用经验法则:如果关系是"is-a" - 使用继承,如果关系是"has-a" - 使用组合.
总是对的吗?
谢谢.
例如,像Visual Studio的"输出"窗口一样.
有没有办法在XAML中做到这一点?
假设我在B类中有虚函数foo(),我需要在B的派生类之一D类中略有不同的行为.可以创建重写函数D :: foo(),并调用B :: foo( )从那里,经过特殊情况处理?像这样:
void D::foo()
{
if (/*something*/)
// do something
else
B::foo();
}
Run Code Online (Sandbox Code Playgroud)
我不是在问这是否会奏效,我知道会这样.我想知道,对于一个好的OOD来说它是否正确.