我有一个像::
这样的课程Class Test
{
public:
void Check(){//dosomething};
static void call(){//I want to call check()};
};
因为call()是一个静态成员,所以它不能调用非静态函数,所以我认为在call()中使用Check()是创建Test指针然后指向Check(),但是我认为这不好,有没有更好的方法呢? 我可以重写静态函数中的所有东西,所以我不需要再次调用Check(),但我想要的是重用Check()中的代码并避免重复代码。
答案 0 :(得分:10)
由于您需要一个实例,您必须创建一个实例,使用静态实例或将其传递给call()
:
Class Test
{
private:
static Test instance;
public:
void Check(){//dosomething};
// use one of the following:
static void call(Test& t){ t.check(); };
static void call(){ Test t; t.check(); };
static void call(){ instance.check(); };
};
答案 1 :(得分:3)
这听起来有些糟糕的设计正在进行中。
无论如何,你可以做的是在调用中创建一个Test实例,并在该实例上调用Check。调用的实现将是这样的:
void call(){
Test test;
test.Check();
}
但是,请注意,如果Check对Test成员执行某些操作,则它仅适用于创建的Test对象。我会重新考虑你是否真的希望呼叫是静态的,或者检查不是。
答案 2 :(得分:0)
对此没有简单的答案。您可以做各种各样的事情,但哪些是正确的取决于您的代码的含义。这是一个设计问题,而不是编程问题。
您已经提出过各种编程技巧,比如创建Test
指针(实际上您不需要Test
指针,只需要一个Test
对象)。我可以建议更多技巧,例如你可以重写call()
以便它不是静态的,或者(几乎相同的)你可以将Test
指针作为call()
的参数传递给使用它,或者您可以创建一个全局Test
对象并使用它。这些都不是问题的核心。要回答你的问题,你必须问自己一些问题,为什么我首先使call()
静态,为什么静态函数需要调用非静态函数。
如果你能解释一下,那么提供更具体的建议会更容易。
答案 3 :(得分:0)
非静态和静态成员函数之间的关键是后者没有任何对象。但是,它仍然具有与所有其他成员相同的访问权限。
如果要从静态成员调用非静态成员函数,则仍需要提供一个对象。通常,静态成员函数将在某些上下文中传递以获取对象。从您的问题的声音看来,静态和非静态函数似乎是为了做类似的事情,不需要和对象。在这种情况下,最好将公共部分(不依赖于任何对象)分解为另一个函数,然后从call()
和Check()
调用:
void Test::call() {
common();
// ... other code
}
void Test::Check() {
common();
// ... other code, possibly depending on "this"
}
void Test::common() {
// logic shared by both call() and Check() but not depending on "this"
}
如果公共代码需要一个对象,除了在静态成员函数中提出一个对象之外别无他法。