C++ C++;用非静态函数重载静态函数
我想打印两种不同的内容,这取决于是使用C++ C++;用非静态函数重载静态函数,c++,static,overloading,non-static,C++,Static,Overloading,Non Static,我想打印两种不同的内容,这取决于是使用Foo::print()静态调用函数还是从Foo-Foo的实例调用函数;foo.print() 编辑:正如一些人已经回答的那样,这里的类定义肯定不起作用 class Foo { string bla; Foo() { bla = "nonstatic"; } void print() { cout << bla << endl; } static void print() { cout <<
Foo::print()
静态调用函数还是从Foo-Foo的实例调用函数;foo.print()代码>
编辑:正如一些人已经回答的那样,这里的类定义肯定不起作用
class Foo {
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
换一种说法,我知道PHP可以检查*这个变量是否被定义,以确定函数是否被静态调用。C++是否具有相同的能力?不,标准直接禁止:
<强> ISO1488∶2003 C++标准131/2 -可重载声明< /强>
某些函数声明不能
超载:
- 不能重载仅在返回类型上不同的函数声明
- 不能重载具有相同名称和相同参数类型的成员函数声明
如果其中任何一个是
静态成员函数声明(9.4)李>
[示例:
-[结束示例]
此外,由于可以在实例上调用静态函数,因此它无论如何都是不明确的:
<强> ISO1488∶2003 C++标准94/2 -静态成员>/P>
类
X
的静态成员s
可以是
指使用限定id
表达式X::s
;没有必要
使用类成员访问语法的步骤
(5.2.5)参考静态构件
。A.
静态
成员可以使用
中的类成员访问语法
在哪种情况下,对象表达式是
评价的。[示例:
-[结束示例]
因此,你所拥有的将是模棱两可的:
class Foo
{
public:
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
int main()
{
Foo f;
// Call the static or non-static member function?
// C++ standard 9.4/2 says that static member
// functions are callable via this syntax. But
// since there's also a non-static function named
// "print()", it is ambiguous.
f.print();
}
class-Foo
{
公众:
字符串bla;
Foo(){bla=“nonstatic”;}
void print(){cout这是绝对不允许的。我看不到任何干净的方法来实现这一点。你想用这种方法解决的问题到底是什么?答案是否定的,因为你不能基于返回类型重载
类中当然可以有静态方法,但不能有:
static void foo();
void foo();
因为它们具有相同的方法签名
编辑:我看到你的评论说你为什么要这样做,你想访问成员变量。你需要这样做:
static void print(Foo f);
void print();
....
static void Foo::print(Foo f)
{
int a = f.a;
// do something with a
}
(或者在Foo中创建getter和setter,等等,但这是一般的想法)您不能完全做到这一点,请参见
但是你可以让Foo::print()
和Foo Foo;print(Foo);
做不同的事情。(定义void print(Foo&Foo)
在与class Foo
相同的命名空间中,ADL会找到它)
无论如何,这不是一个好主意。您有两个名称非常相似的函数,它们做的事情完全不同,这违反了良好的设计原则。两个版本的print()
具有相同的签名。我认为它们不能以这种方式重载。解释起来有点复杂,但我有一些非静态变量,我希望静态函数在从类的实例调用时可以访问这些变量。我可以将函数命名为其他名称,使其非静态,但我认为这会ovide是一个很好的一致性API,只有一个函数可供用户使用。如果这没有意义,很抱歉。@Lex-您似乎误解了“静态”的含义。您不能使用静态方法访问非静态变量;您没有处理类的实例化。唯一的方法是传递我知道Brian,但是你可以“非静态地”调用静态成员,所以不要使用Foo::print();
,而是使用Foo-Foo;Foo.print();
你不是在“非静态地”调用它…它仍然在类中调用相同的静态函数,并且与您碰巧拥有的类的实例无关。它与Foo::print()没有什么不同
See:-我认为这是你困惑的根源。啊,好吧,那么在这种情况下,foo
的实例没有任何意义,也无法从print()
中访问。感谢你的澄清。谢谢你给出了非常明确的答案,但我在问(很遗憾,我为此道歉)静态函数的行为是否可以根据静态调用还是从类的实例来确定。请参阅我的问题的后面部分。@ Lex Fridman:我认为你问的不好。你问“C++是否具有相同的能力?”我回答说,你不能基于C++标准(定义语言)。.我对这个问题的措辞感到越来越糟糕,尤其是标题。实际上有两个问题。第一个问题是,你是否可以用非静态重载静态。这就是你回答得很好的问题。第二个问题是,你是否可以确定是否有一个类的实例与静态函数的调用相关联。如你说,你可以使用这样一个静态函数:Foo-Foo;Foo.print();
我可以从调用print()中访问Foo
实例吗啊,好吧。你已经为我澄清了,所以不用担心你的措辞。我会回答这个问题。我知道这看起来是个糟糕的设计,因为我没有确切地解释我正在试图解决的问题。这对我正在做的事情来说是有意义的。然而,在C++的上下文中,这可能是一个糟糕的做法。我知道这是个坏消息。在解释语言(如PHP)中需要做的事情。@Lex:这两个函数必须做不同的事情,所以其中一个函数肯定可以有不同的名称。可能Foo::PrintLiveFooCount();
和Foo-Foo;Foo.print()
?但是如果他这样做了,下一个维护人员将有一个重大的WTF时刻,当他试图理解为什么有人更喜欢Foo::print(f)
而不是class Foo
{
public:
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
int main()
{
Foo f;
// Call the static or non-static member function?
// C++ standard 9.4/2 says that static member
// functions are callable via this syntax. But
// since there's also a non-static function named
// "print()", it is ambiguous.
f.print();
}
static void foo();
void foo();
static void print(Foo f);
void print();
....
static void Foo::print(Foo f)
{
int a = f.a;
// do something with a
}