C++ 静态方法(在不同的类中)(如 Java 的)

Posted

技术标签:

【中文标题】C++ 静态方法(在不同的类中)(如 Java 的)【英文标题】:C++ Static Methods (In different Classes) (Like Java's) 【发布时间】:2012-03-07 01:04:40 【问题描述】:

当我有多个 .cpp 文件时,我将如何制作像 java 中的静态方法一样使用的静态方法?

在 java 中,您可以使用 MyClass name = new MyClass(); 来引用另一个类。当在您拥有的任何其他文件中调用时,此类中的每个变量都将相同。

在你想在其中使用该类的每个函数中,必须能够通过引用 MyClass& 名称来传递我似乎很痛苦。

有没有办法在 .cpp 文件的顶部定义 MyClass 名称,而不会在内存中创建该对象的全新实例并擦除所有进度,例如,如果您尝试制作一个简单的计数器,主类会告诉计数类递增,可见性类会从计数类获取计数并将其打印到屏幕上。现在这很简单,因为您可以将计数类传递给可见性,但是如果您有 20 多个方法,那么很难跟踪。

我对静态或引用不太熟悉,我环顾四周并看到了“命名空间”,但我不确定我会在哪里定义它,或者它是否是我什至需要的。

提前致谢

示例 Java 代码:

public class Foo
private static int counter = 0;

public int getCounter()
    return counter;


public void incrCounter()
    counter+=1;



public class MainProg
public static void main(String[] args)
    Foo foo = new Foo();
    Display disp = new Display();
    foo.incrCounter();
    foo.incrCounter();
    disp.displayCounter();



public class Display
Foo foo = new Foo();
public void displayCounter()
    foo.incrCounter();
    System.out.println(foo.getCounter());


这应该打印出“3”

【问题讨论】:

the book you're learning C++ from 说什么? 我想你会使用一个头文件。默认情况下,所有方法在 C++ 中都是“静态的”,除非它们包含在对象中。每个类不代表一个对象,但可以包含多个对象或零个对象。 我的类已经在使用头文件和 .cpp 文件,但我试图避免不断地绕过对象。 你应该真正说明你要解决的问题是什么,而不是语言的问题。很难确定你在担心什么,你需要一个全局变量吗?类的静态成员?你想访问什么?另请注意,您提供的 Java 代码与描述毫无意义... 在 Java 中,您可以访问任意多个其他类中的类,只要变量是静态的,您访问的类中的值将始终相同。我正在寻找一种在 C++ 中执行此操作的方法。 【参考方案1】:

在 C++ 中,使用范围解析运算符 :: 代替 Java 中的 .。你可以像这样调用静态方法:

在标题中:

class MyClass 
public:
    static int myPrivateStaticVar;
    static void myStaticMethod();
;

在cpp文件中:

#include "myfile.h"
#include <iostream>

using namespace std;

int MyClass::myPrivateStaticVar = 123;

void MyClass::myStaticMethod() 
    cerr << "hello, world! " << myPrivateStaticVar  << endl;


int main() 
    MyClass::myStaticMethod();

您的静态方法 myStaticMethod 需要在 MyClass 类中公开。

【讨论】:

所以你不需要定义一个全新的对象,如果你在所有类的某个地方初始化了一个 MyClass,使用 MyClass:: 将能够使用更新的值? @Brink C++ 中的静态方法与 Java 中的静态方法具有相同的限制:它们只能访问静态变量,并且只能调用类的静态成员函数。您不能从静态方法访问类的实例方法实例变量,除非对象的实例静态可用(例如,在单例实现中)。跨度> 当我使用您提供的示例时,我得到“错误:无法在没有对象的情况下调用成员函数 'Myclass::myMethod(int)'”,我将方法更改为静态,但这也不起作用.我不想声明一个对象... 它有点工作,除了它说我正在使用的静态变量有一个未定义的引用。 这是说我有一个未定义的对 MyClass::(variable) 的引用,但我认为现在这是一个完全不同的问题。【参考方案2】:

在 Java 中,您可以访问任意多个其他类中的类,只要变量是静态的,您访问的类中的值将始终相同。

你的意思是,像一个全局变量?您可以像这样声明一个全局变量:

extern int foo;

你需要一个定义,它是这样的:

int foo = 42;

声明如果放在一个包含在任何需要的地方的头文件中将会很好地工作,并且定义应该放在一个源文件中。

【讨论】:

但是这不是声明了一个新的foo实例吗,它会回到类中已经设置好的默认变量吗?我希望声明一个 foo 对象,但它是否能够使用已从另一个类更改的变量。 什么课?我的示例中没有类。 如果您可以查看我在 Java 顶部的示例代码,那么您可能会看到我想要了解的内容。

以上是关于C++ 静态方法(在不同的类中)(如 Java 的)的主要内容,如果未能解决你的问题,请参考以下文章

静态类和内部类的区别是啥

静态方法怎么调用

如何在 C++ 中的类中递归调用函数方法?

一个java小问题,Pattern类中的类方法(静态方法)compile(String regex

C++可不可以让子类继承父类的静态成员后赋予它各自不同的值?

在java中,有main方法的类叫啥类,没有main方法的类叫啥类