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

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

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

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

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

1回答

4560閲覧

Qt Createrで自作のクラスを追加する(C++)

Toyotake

総合スコア7

C++

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

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2016/08/04 03:28

###前提・実現したいこと
Qt Createrを使っています。
新たなクラスを自作して追加したいのですが、リンカーエラーとなってしまいます

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

:-1: エラー: symbol(s) not found for architecture x86_64 :-1: エラー: linker command failed with exit code 1 (use -v to see invocation)

###該当のソースコード

C++

1(a.h) 2#ifndef COLLEAGUETEXTFIELD_H 3#define COLLEAGUETEXTFIELD_H 4 5#include "mediator.h" 6#include "colleague.h" 7#include <QDialog> 8#include <QtWidgets> 9 10 11//! [0] 12class ColleagueTextField : public QDialog{ 13 Q_OBJECT 14 15private: 16 Mediator mediator; 17 18public: 19 ColleagueTextField(); 20 21 void setMediator(Mediator m); 22 23 void setColleagueEnabled(bool e); 24}; 25//! [0] 26 27#endif // COLLEAGUETEXTFIELD_H
(a.cpp) #include "colleaguetextfield.h" //! [0] ColleagueTextField::ColleagueTextField() { } //! [0] void setMediator(Mediator m){ this->mediator = m; } void setColleagueEnabled(bool e){ //something }

###試したこと
mocファイルが生成されていることは確認しました

###補足情報(言語/FW/ツール等のバージョンなど)
Qt Creater 5.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

エラー・メッセージに何が見つからないのか出ていないことと、コンパイル・エラーになってないので、外しているかもしれませんが、a.cppのsetMediator()とsetColleagueEnabled()の定義は下記のように書かないとリンクエラーになると思います。

C++

1void ColleagueTextField::setMediator(Mediator m){ 2 this->mediator = m; 3} 4 5void ColleagueTextField::setColleagueEnabled(bool e){ 6 //something 7}

投稿2016/08/04 03:48

Chironian

総合スコア23272

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

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

Toyotake

2016/08/04 04:29

ご回答ありがとうございます そのことがすっかり抜けておりました しかし、ご指摘いただいたように記述しても同じエラー文を吐かれてしまいました またコンパイルターゲットを指定するファイル(.pro)も確認しましたが、 どちらのファイルも含まれていました
Chironian

2016/08/04 05:23

下記がコンパイル・エラーにならずにリンクまで進むのは何かおかしいです。 thisというグローバル変数を定義していればありえますが、普通はしないと思います。 void setMediator(Mediator m){   this->mediator = m; } また、エラーメッセージで検索したところ、そのメッセージの直前に何が見つからなかったのか出力されるようです。 http://kiwamunet.hateblo.jp/entry/2015/07/01/125907 本当にでてませんか? 出てない場合はQtCreatorが隠していると思います。 さて、取り敢えず自作のクラス定義とそれを使っているものを全て#if 0~#endifで囲ってみるとどうなりますか? それでもリンク・エラーになるなら、原因は別にあります。 リンク・エラーが消えたら、少しづつ#if 0~#endifを解除してビルドすることで、問題が発生する場所を絞り込んでいくと良いです。最初は定義側だけ解除、次に使っているものを1つずつ解除です。
Toyotake

2016/08/04 06:24

ご返信ありがとうございます 解決しました コンパイル出力のエラーメッセージを表示したところ以下のようにありました Undefined symbols for architecture x86_64: "vtable for Mediator", referenced from: Mediator::Mediator() in colleaguetextfield.o NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 指示に従い、該当クラスの virtual void createColleagues(); を virtual void createColleagues(){}のように したところ解決しました ご指導ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問