C++中const成员函数中的静态成员修改

4
我正在处理链表,但无法在常量函数“void Print() const”中修改当前指针的值。
在Print函数中,我想执行“current = head”,然后像“current = current->link”一样递增,但不能这样做,因为它显示:
“error C3490:'current' 无法修改,因为它是通过const对象访问的 e:\Cpp\projects\data structure ass-1\data structure ass-1\source.cpp 83 1 Data Structure Ass-1”
#include<iostream>

struct node
{
    int data;
    node *link;
};    

class List
{
    node *head,*current,*last;
public:
    List();
//  List(const List&);
//  ~List();

void print() const;

};

using namespace std;

int main()
{
    List List1;
}

void List::print() const
{
     current=head;   //here is my error
     current=current->link;
}

List::List():current(head)
{

}

2
我认为你的空格/注释中有一些代码!;) 但是说真的,请将这个示例压缩一下。 - daniel gratzer
你可以将当前成员设置为mutable,以便在const函数中进行修改。 - Sam
或者,你可以在 print 函数中创建一个临时的本地变量 node* 类型,而不是使用 current 作为成员。 - Sam
6个回答

4

如果一个类的成员函数被声明为 const

void print() const;

这意味着该函数无法修改其类的数据成员。在您的情况下,变量:
node *head,*current,*last;

print()函数的内部无法修改指针的地址。因此,您无法更改这些指针所指向的地址。解决此问题的方法是在print()函数中定义一个局部变量temp。这样的变量可以被修改,并且能够完成与current相同的工作:

void List::print() const
{
    node *temp;     
    temp=head;   
    temp=temp->link;
}

3
当你声明一个`const`成员函数时,当针对一个对象调用该函数时,`this`指针在`const`函数内部变为了`const`。这意味着`const`成员函数防止类的数据成员被直接或间接修改。
直接修改是指在`const`成员函数中直接修改数据成员(违反其目的的操作)。可以进行任何涉及数据成员的操作,除非你不修改它们。此外,在`const`成员函数中可以调用其他`const`成员函数。
间接修改意味着甚至不能调用类的其他`non-const`成员函数,因为它们可能会修改数据成员。
通常情况下,`const`成员函数用于仅获取/读取值的情况。因此,在您的情况下,不应使用`const`成员函数。
此外,您可以为`non-const`对象调用`non-const`和`const`成员函数。

2
问题是,他可以在打印函数中创建一个本地的“current”指针来遍历列表,而不是使其非const。常量正确性是一件好事!现在如果我们能教会人们停止使用那个可怕的“using namespace std;”就好了... - George
是的,我也有同感,但在这种情况下,函数的名称和功能是不同的,“print”实际上并没有打印任何内容。 - Uchia Itachi
打印(print)是用于打印输出的,但是为了遍历链表中的所有节点,我们需要使用“current=current->link”的方法。是否有其他方法可以打印链表中的所有节点? - Sohail Haider
哦,那好吧。你可以按照其他人的建议去做,比如乔治在上面的评论中提到的。 - Uchia Itachi

2
您将print()函数声明为const。这意味着该函数不会修改类的成员变量,然而这却是您在函数定义中首先要做的事情。

1

node *head,*current,*last; 修改为 mutable node *head,*current,*last;


0
错误告诉你发生了什么 - 当你使用 List::print() const 时,你承诺不修改列表的任何成员。但是然后你试图修改 current
很难说不看到你代码的其他部分,但也许 current 不应该是一个成员变量,而应该是局部变量在 List::print() 中。或者也许 List::print() 不应该是常量。你也可以将 current 设置为可变的,但这几乎总是不好的实践。

0

在方法print中将current声明为局部变量。如果您正在将current用作其他目的的成员变量,则局部变量将覆盖它。如果您不使用current作为成员变量,则可以将其删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接