4

リンクリストに取り組んでいますが、const 関数 "void Print() const" の現在のポインターの値を変更できません

関数 Print で、「current= head」を実行してから、「current=current- >link」のようにインクリメントしたいのですが、そうすることができません。bcz はそれを示しています

「エラー 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)
{

}
4

6 に答える 6

4

クラスのメンバー関数が次のように宣言されている場合const:

void print() const;

つまり、この関数はそのクラスのデータ メンバーを変更できません。あなたの場合、変数:

node *head,*current,*last;

の本体では変更できませんprint()。したがって、これらのポインターが指すアドレスを変更することはできません。この問題を回避する方法tempは、print()関数でローカル変数を定義することです。このような変数を変更して、本来の動作と同じcurrentことを行うことができます:

void List::print() const
{
    node *temp;     
    temp=head;   
    temp=temp->link;
}
于 2013-09-01T07:55:45.743 に答える
3

constメンバー関数を宣言すると、オブジェクトに対して呼び出されたときにthisポインターが関数const内になります。const

つまり、constメンバー関数は、クラスのデータ メンバーの直接的または間接的な変更を防ぎます。

直接は、プログラムで行っているようなものを意味します(const目的に違反しているメンバー関数でデータメンバーを直接変更します)。データ メンバーを変更しない限り、データ メンバーに関連する操作を行ってもかまいません。constまた、メンバー関数内で他のメンバー関数を呼び出すこともできますconst

non-constIndirect は、データ メンバーを変更する可能性があるため、クラスの他のメンバー関数を呼び出すことさえできないことを意味します。

通常const、値を取得/読み取りたい場合は、メンバー関数が使用されます。したがって、あなたの場合、constメンバー関数を使用しないでください。

また、オブジェクトの関数を呼び出しnon-constてメンバーにすることもできます。constnon-const

于 2013-09-01T04:46:27.983 に答える
2

print() 関数を const として宣言しました。これは、関数がクラスのメンバー変数をまだ変更していないことを意味します。これは、関数定義で最初に行うことです。

于 2013-09-01T04:25:06.543 に答える
1

node *head,*current,*last;に変更mutable node *head,*current,*last;

于 2013-09-01T06:59:26.033 に答える
0

このエラーは、何が起きているかを正確に示しています - あなたが言うときList::print() const、あなたはあなたのリストのどのメンバーも変更しないことを約束しています. しかし、あなたは行って変更しようとしcurrentます。

コードの残りの部分を見ずに言うのは難しいですが、おそらくcurrentメンバー変数であってはならず、 に対してローカルであるべきList::print()です。または、おそらくList::print()const であってはなりません。ミュータブルにすることもできますがcurrent、それはほとんど常に悪い習慣です。

于 2013-09-01T04:25:13.780 に答える
0

currentメソッド print に対してローカル変数として宣言します。current他の目的でメンバー変数として使用している場合、ローカル変数はそれを隠します。メンバー変数として使用していない場合はcurrent、削除するだけです。

于 2013-09-01T04:28:26.597 に答える