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

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

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

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

Q&A

解決済

1回答

4091閲覧

C++ .hppと.cpp ヘッダファイルとソースファイルに分けてincludeしたい

mjk

総合スコア303

C++

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

0グッド

0クリップ

投稿2020/09/14 18:42

###実現したいこと

参考質問:【C++】なぜヘッダと実装はわけるべきなのでしょうか(.hに実装を書くことは邪道か)

個人でよく使う関数などをまとめたいというのが動機でヘッダファイル1つだけにまとめる実装は出来ました。
しかしヘッダファイルは宣言だけにしてヘッダファイルには定義しないのが一般的ということを知って実際に試してみようと思ったのが発端です。
よくない方法だと知ったのでヘッダファイルとソースファイルに分けて実装する方法も知っておきたいと思いました。

※独学で不慣れなので用語や考え方に間違いがあればご指摘ください。

MAIN.cpp メインのソースファイル
b.hpp 関数が宣言されたヘッダファイル
b.cpp 関数が定義されたソースファイル

MAIN.cppからb.hppをインクルードしてb.cppの関数を使いたい。

具体的にはfunc1("test");が実行され、出力でtestと表示されるようにしたい。(入力なし)

###質問
下記リンク先のpaiazaのオンライン実行環境で複数ファイルを作成しています。
ヘッダファイルのみの場合想定通りの挙動をするのですが、
ソースファイルとヘッダファイルに分けるエラーとなり原因が分からないのでご教示ください。
よろしくお願いします。

###試したこと
普段使っているVSCodeの環境でブログを参考にヘッダファイルとソースファイルを分けようとしていましたがpaizaでのエラーと同様なエラーとなってうまくいきません。
コンパイル環境などに原因があるか切り分けたいのでpaizaの実行環境で試してもエラーとなりました。

error: redefinition ofのエラー内容で検索すると2重定義のエラーというキーワードが出てくるのですが、どいうことかよく分かりませんでした。

もしかするとヘッダファイルとソースファイルで2回func()が書かれているからかとも思いましたが、ヘッダファイルとソースファイルがそういうセット同士のような関係なので宣言と定義で2回書かなてなければならないはずだと思います。

いくつか検索したブログなどの中でリンク先のものが自分には分かりやすかったのですが同じようにしてるつもりがうまくいかないのでアドバイスなどあればご教示ください。


error

1b.cpp:2:6: error: redefinition of 'func1' 2void func1(std::string s) { std::cout << s << std::endl; } 3 ^ 4./b.hpp:4:6: note: previous definition is here 5void func1(std::string s) {} 6 ^ 71 error generated.

###MAIN.cpp

C++

1#include "b.hpp" 2int main() { 3 func1("test"); 4}

###b.hpp

C++

1#pragma once 2#include <iostream> 3#include <string> 4void func1(std::string s) {}

###b.cpp

C++

1#include "b.hpp" 2void func1(std::string s) { std::cout << s << std::endl; }

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

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

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

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

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

1T2R3M4

2020/09/14 18:54

ヘッダ内の void func1(std::string s) {} はプロトタイプ宣言で void func1(std::string s); ではないでしょうか。
mjk

2020/09/14 18:59

ご指摘ありがとうございます。試してみます。
1T2R3M4

2020/09/14 19:08

回答させていただきました。
guest

回答1

0

ベストアンサー

ヘッダ内の
void func1(std::string s) {}
はプロトタイプ宣言で
void func1(std::string s);
ではないでしょうか。

b.hpp内の
void func1(std::string s) {}

b.cpp内の
void func1(std::string s) { std::cout << s << std::endl; }
で同名関数を2度定義したという解釈です。

投稿2020/09/14 19:07

1T2R3M4

総合スコア114

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

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

mjk

2020/09/14 19:20

回答ありがとうございます。 普段1ファイルしか使っていなかったので勉強になります。 プロトタイプ宣言なども調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問