【问题标题】:Illegal call of non-static member function非法调用非静态成员函数
【发布时间】:2012-08-23 11:06:56
【问题描述】:

我想做一个计算器,可以计算几乎任何长度的数字。

我需要的第一个函数是将字符串转换为链表,然后返回指向链表头部的指针。

但是,在编译时我遇到了一个错误: 错误 C2352:'main::StringToList':非法调用非静态成员。行:7;

我为您提供了我的 main.cpp 和 main.h 文件。

谢谢大家

main.cpp

#include "main.h"

int main()
{
main::node *head = main::StringToList("123");

main::node *temp = new main::node;

temp = head;
while (temp->next != NULL)
{
    cout << temp->data;
    temp = temp->next;
}

std::cout << "\nThe program has completed successfully\n\n";
system("PAUSE");
return 0;
}

main::node * StringToList(string number) 
{

int loopTimes = number.length() - 1; 
int looper = 0;         
int *i = new int;       
i = &looper;            
main::node *temp = new main::node;  
main::node *head;               
head = temp;            
for ( i = &loopTimes ; *i >= 0; *i = *i - 1) 
{
    temp->data = number[*i] - 48;   
    main::node *temp2 = new main::node;         
    temp->next = temp2;             
    temp = temp2;                   
}
temp->next = NULL;                  
return head;
}

main.h

#ifndef MAIN_H
#define MAIN_H

#include <iostream>
#include <string>

using namespace std;

class main
{
public:
typedef struct node
{
    int data;
    node *next;
};
node* StringToList (string number);
};

#endif

【问题讨论】:

  • 将你的类命名为“main”真的很混乱。
  • int *i = new int; i = &amp;looper;为什么要新建一个整数,然后马上扔掉指向它的指针,让它永远丢失?

标签: c++ function call non-static


【解决方案1】:

你需要实例化你的主类并调用 StringToList 作为成员:

main* m = new main;
main::node *head = m->StringToList("123");
...
delete m;

【讨论】:

  • 即使函数是非静态的确实有意义(它可能没有),没有理由用new创建对象,绝对没有理由泄露它像这样。
  • 我绝对同意这一点——上面显示的源代码还有很多问题,无论是变量命名、缩进还是其他任何问题,但编译器错误的主要原因是将方法调用为静态的,因此您必须将其定义为静态或将其称为成员:-)(当然之后要清理)
  • 在这种情况下,创建一个临时或自动对象。即使您确实记得清理,也绝对没有理由在这里进行动态分配。 (虽然临时会有问题,因为main() 会被解释为函数调用)。
【解决方案2】:

您必须将StringToList 声明为static 才能正常工作:

static node* StringToList(string number);

在这一行:

main::node *head = main::StringToList("123");

您正在尝试调用StringToList,而没有首先创建main 类型的对象。因为它是一个非静态成员函数,所以这不起作用。你必须这样做:

main foo;
main::node *head foo.StringToList("123");

不过,这对您的用例没有意义。

【讨论】:

  • 它会工作,但OP不应该创建一个构造函数吗?
  • 好吧,OPs 代码有点问题。对于经典链表来说,有一个node-class 和一个单独的函数来构造列表是有意义的。如果你在node-class 的构造函数中这样做,你会得到一个递归的构造函数调用,这可能会让人困惑。
  • @Anonymous:当然可以。如果有任何非静态成员,则它无法访问这些成员,但没有任何成员。 (当然,这使得类本身的存在变得毫无意义,但批评设计有点离题)。
  • @Anonymous:node 是公共嵌套类型,因此可以从任何非成员函数访问。
【解决方案3】:

由于node* StringToList (string number); 不是静态的,所以您不能将其称为main::StringToList("123");

先创建一个 main 对象,然后像这样调用它

main mn;
mn.StringToList("123");

否则将node* StringToList (string number); 声明为static node* StringToList (string number);

【讨论】:

  • StringToList 设为静态成员函数比创建类的实例更有意义。
  • 除掉类并将函数放在命名空间中更有意义,除非有一些非静态数据、虚函数或问题中省略的任何内容。跨度>
  • @DavidSchwartz:- 本来想写一样的,但工业 C# 效果让我很困惑。所以认为 Pollex 可以确认更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多