Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;用非静态函数重载静态函数_C++_Static_Overloading_Non Static - Fatal编程技术网

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
}