指向成员的指针对托管类无效
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
是一个私有成员函数,它如何可以直接从外部类调用,并且也无需创建任何对象。它不是静态成员函数。请检查这一点。
【讨论】:
以上是关于指向成员的指针对托管类无效的主要内容,如果未能解决你的问题,请参考以下文章