指向成员的指针对托管类无效

Posted

技术标签:

【中文标题】指向成员的指针对托管类无效【英文标题】:A pointer-to-member is not valid for a managed class 【发布时间】:2016-01-03 06:39:17 【问题描述】:

我在 Visual Studio C++ 中有一个 Windows 窗体。 (CLR)

在头文件中我声明bool isRunning(以查找记事本是否正在运行):

private: 
    bool isRunning(LPCSTR pnotepad)
    
        HWND hwnd;
        hwnd = FindWindow(NULL, pnotepad);
        if (hwnd != 0)
        
            return true;
        
        else
        
            return false;
        
    

现在在一个复选框上,我希望它检查进程是否正在运行。

private: System::Void checkBox2_CheckedChanged(System::Object^  sender, System::EventArgs^  e) 

if (bool application::GUI::isRunning)
    label1->Text = "cat";

我得到这个错误:

指向成员的指针对于托管类无效

我尝试将其更改为&isRunning。这给了我与上面相同的错误和

对绑定成员函数表达式的非法操作

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

下面的一切似乎都是错误的:

if (bool application::GUI::isRunning)

    如果您不想保存函数的结果,则不需要bool。要么定义一个布尔变量并将函数的结果分配给它:

    bool result = isRunning(...);
    if(result)
         ...
    

if(isRunning())
   ...
    application::gui::isRunning 表达式返回您试图将其定义为布尔变量的 isRunning 函数的指针。

    假设您将前两个固定为:

    LPCSTR arg = ...;
    if(application::GUI::isRunning(arg))
         label1->Text = "cat";
    

这意味着您正在调用 static 类的 GUI 函数 或者GUI命名空间下的函数(GUI也在application命名空间下)。

我的猜测是 GUI 是一个 Form 类,因此您尝试调用该函数,但由于该函数不是 static,您将再次遇到错误。所以你有两种情况需要解决:

如果您从GUI 的另一个函数中收到此错误

 LPCSTR arg = ...;
 if (isRunning(arg))
     label1->Text = "cat";

否则你需要一个指向 GUI 对象的指针:

 LPCSTR arg = ...;
 if (gui-> isRunning(arg))
     label1->Text = "cat";

【讨论】:

感谢您的回复。是的,GUI 是一种形式。出于某种原因,我仍然收到来自LPCSTR arg = isRunning; 的错误“指向成员的指针对托管类无效”。 if (GUI->isRunning(arg)) 还给了我错误“表达式必须具有 bool 类型(或可转换为 bool)”我正在尝试学习 C++,所以也许我在这里遗漏了一些非常简单的东西。 @Evan 如果您从某个 GUI 的另一个函数调用该函数,请使用第一个选项。否则(假设你从 GUI2 类调用它)你需要一个指向 GUI 的指针。我故意写了gui->isRunning()小写。它应该告诉你gui 是一个指向GUI 实例的指针。 (GUI *gui = ...) 顺便说一句,如果你想学习 c++,你应该从标准 c++(目前是 c++14)开始。 clr的c++版本叫visual c++,确实有区别。 仍然不断收到错误“指向成员的指针对托管类无效”,但我自己想通了。 if (const char LPCSTR = true) label1->Text = "running"; else label1->Text = "not running"; 非常感谢您的帮助,感谢您的建议,我会先尝试学习常规的 c++。我只是想要一个我正在做的小项目的 GUI,并且阅读 QT 很难,不知道它会是 c++ 的不同变体。 这也有效(我想它更好,因为使用 LPCSTR 不是特定的?)if (const char pnotepad = true) label1->Text = "running"; else label1->Text = "not running";【参考方案2】:

我认为您以不正确的方式进行函数调用。 大概应该是下面这样,

if (application::GUI::isRunning())

    label1->Text = "cat";

以上只是进行正确函数调用的提示——但由于isRunning 是一个私有成员函数,它如何可以直接从外部类调用,并且也无需创建任何对象。它不是静态成员函数。请检查这一点。

【讨论】:

以上是关于指向成员的指针对托管类无效的主要内容,如果未能解决你的问题,请参考以下文章

指向托管类成员的指针

指向成员转换的指​​针

具有非托管成员的托管类

这个指向成员转换的指​​针有啥问题?

c++/cli 仅向托管类公开内部成员

我可以在 2 个不同的托管服务中托管我的主域和它的子域吗