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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

2回答

2355閲覧

visualstudioでエラーが出てしまいます。どなたかどうしたら直るかわかりませんか?

UE4benkyo-

総合スコア37

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

1クリップ

投稿2021/05/04 07:07

編集2021/05/04 10:14

visualstudioでこのようなエラーが出てしまいます。

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー LNK2005 "private: static class std::unique_ptr<class Object,struct std::default_delete<class Object> > Object::s_object" (?s_object@Object@@0V?$unique_ptr@VObject@@U?$default_delete@VObject@@@std@@@std@@A) は既に Object.obj で定義されています。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー LNK1169 1 つ以上の複数回定義されているシンボルが見つかりました。

どこをどう直せばいいのでしょうか?
わかる方教えてください。

追記

関係ありそうなコードを載せます。

使うときは

Object& m_object = Object::GetInstance();

という感じに書いています。

参考になるかわかりませんがそもそもインクルードするとビルドが通らなくなるような気がします。

よろしくお願いします.

/*//////// Object.h ///////*/ #pragma once class Object { private: private: //コンストラクタ Object() { } public:      //参照を返す static Object& GetInstance() { //nullの場合 if (s_object == nullptr) { s_object.reset(new Object()); } return *s_object.get(); } private: //ポインタを格納するために静的な変数を宣言 static std::unique_ptr<Object> s_object; }; //静的な変数を初期化する std::unique_ptr<Object> Object::s_object = nullptr;

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

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

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

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

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

1T2R3M4

2021/05/04 07:10

ソースコードも環境設定も明示せずにですか。 荒らし目的ですか。
y_waiwai

2021/05/04 07:14

コードを提示しましょう
UE4benkyo-

2021/05/04 07:15

すみません。私なりに考えたのですが自身の力では難しいと考えたので投稿させていただきました。 環境はvisual studio2019を使っています。
episteme

2021/05/04 07:18

いやだからコードみせて。
y_waiwai

2021/05/04 07:18

ならなおさらコードを提示しましょうよ。 親切にも日本語のメッセージを出してくれてますが、こころあたりはないですか?
UE4benkyo-

2021/05/04 07:29 編集

申し訳ありません。 検索などしてみましたがmain関数が2回書かれているとかではなかったです。 ソースコードは載せたいのですがどこでエラーが起きているのかわかりません。 ですので、エラーを載せました。すみません。
episteme

2021/05/04 07:30

リンクエラー: 「Object::s_object が(少なくとも)ふたつ定義されてるから、どっちをリンクしていいのやら...」と言うてます。なのでやっぱりコードみせてくれんと原因はわかりません。
guest

回答2

0

std::unique_ptr<Object> Object::s_object = nullptr;

これはヘッダに書いちゃダメ。

C++

1// Object.cpp 2#include "Object.h" 3std::unique_ptr<Object> Object::s_object = nullptr;

たとえばコレ↑でどうだ。

投稿2021/05/04 10:14

episteme

総合スコア16614

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

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

UE4benkyo-

2021/05/04 10:56

回答ありがとうございます。 まさにその回答でした。 ありがとうございました!
guest

0

ベストアンサー

ヘッダファイルから下記の変数定義の行を削除して、適切なソースファイルで定義しなければなりません。

//静的な変数を初期化する
std::unique_ptr<Object> Object::s_object = nullptr;

ヘッダファイルに変数定義を記載しておくと、このヘッダファイルをインクルードしたすべてのソースファイルで変数が作成されてしまいます。各ソースファイルのコンパイルは通りますが、コンパイルしたソースファイルをリンクするところで変数が多重に定義されているとして、ビルドがエラーになります。

このあたりの感覚を体得するためにも、C++に慣れていないうちはヘッダ(宣言)とソース(定義)の分離を徹底した方が良いかと思います。

投稿2021/05/04 09:49

Serbonis

総合スコア581

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

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

dodox86

2021/05/04 10:10

初心の方にありがちなように思いますが、変数の「宣言」と「定義」の区別がつかないのかな、と。宣言と定義が同時に行われているような場合もありますし。
UE4benkyo-

2021/05/04 10:57

わかりやすかったのでベストアンサーにさせていただきました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問