質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1628閲覧

C++ での意味不明なコンパイルエラー

extremeNoob

総合スコア1

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/04/22 10:17

編集2021/04/23 13:17

前提・実現したいこと

C++初心者です双方向連続リストのクラスを作っていたらエラーに出くわしました。助けてください。????????

発生している問題・エラーメッセージ

Visual Studio Codeでデバッグをしたところ、以下のようにコンパイルエラーが出たというメッセージは出てきましたがエラーは何も表示されませんでした。
イメージ説明
イメージ説明
次に、コマンドプロンプトでg++を使ってコンパイルをしたところ、以下のようなエラーメッセージが出てきました。

C:\XXX\XXX\AppData\Local\Temp\ccTqXjt6.o:linkedList.cpp:(.rdata$.refptr._ZN10linkedList3nilE[.refptr._ZN10linkedList3nilE]+0x0): undefined reference to `linkedList::nil' collect2.exe: error: ld returned 1 exit status

該当のソースコード

class linkedList{ public: struct n{ int key; struct n *previous , *next; }typedef node; static node *nil; linkedList(){ nil = (node *)malloc(sizeof(node)); nil->next = nil->previous = nil; } int getKey(int i){ node *current = nil->previous; int index = 0; while(true){ if(index == i) return current->key; ++index; current = current->next; } return 0; } void setKey(int i){ } void addFirst(int key){ node *x = (node *)malloc(sizeof(node)); x->key = key; x->next = nil->next; nil->next->previous = x; nil->next = x; x->previous = nil; } private: }; int main(){ linkedList *list = (linkedList *)malloc(sizeof(linkedList)); std::cout << "hi_1" << std::endl; list->addFirst(0); list->addFirst(1); list->addFirst(2); std::cout << list->getKey(0) << std::endl; std::cout << list->getKey(1) << std::endl; std::cout << list->getKey(2) << std::endl; }

理想の実行結果

hi_1 0 1 2

###追記
もともとのコードの class linkedList { 略 }; の後に一行
linkedList::node *linkedList::nil; と付け加えたら以前のようなリンクエラーはなくなり、コンパイルエラーもなくなりましたが例外が発生しました。どうすれば直せるのかさっぱりわからないので教えてください

イメージ説明

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

「undefined reference to `linkedList::nil'」がエラーメッセージで、
linkedList::nilが宣言しかなくて定義がないので、リンカーエラーになってますね。

class linkedList { 略 } ; の、外側に(ふつうは.cpp側に)、node *linkedList::nil;とか定義を書く必要があるでしょう。
VisualC++ではないとはおもいますけどね。

投稿2021/04/22 10:32

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extremeNoob

2021/04/23 13:21

回答ありがとうございます。例外が発生したので追記しました。
guest

0

linkedList *list = (linkedList *)malloc(sizeof(linkedList));

この記述で listlinkedList型のオブジェクトを指す状態にしたつもりなのでしょうが,
これではオブジェクトは構築されていません.
mallocは単に sizeof(linkedList) [byte]分のメモリを用意するだけです.
そこにまともに構築されたオブジェクトはありません.

linkedListのコンストラクタがnilに行っている処理自体のデンジャラス感はとりあえず置いておくとしても,
linkedList型のオブジェクトが生成されていないのですから,このコンストラクタが走ることもなく,よって,nilの値は不定です.

オブジェクトをきちんと 構築/解体 するためには,
mallocとfreeではなくて,newとdeleteを用いるべきでしょう.

投稿2021/04/23 15:18

編集2021/04/23 15:23
fana

総合スコア11656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/04/23 15:20

(main()内のlistをわざわざnewで作る必要自体もなさそうに見えるが,それはそれとして.)
extremeNoob

2021/04/24 00:37

解決しました。ありがとうございました。すべてのところでmallocの代わりにnewを使ったら直りました。
extremeNoob

2021/04/24 15:49

fanaさんもベストアンサーにしたかったのですが、初めに回答してくださった方にしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問