前提・実現したいこと
C++でポインタからメンバ関数を呼びすというプログラムを書きました。
コンパイルは通るものの実行結果が想定と違います。
本体で宣言したポインタからよそのファイルに定義されたメンバ関数を呼び出したのですが、うまくいきません。
出力結果は
hello from initialize
hello
が得られるかなと思いましたが、何も出力されませんでした。
初学者です。専門用語の言い回しなどまだよくわかっていないため上記の表現で伝わるかわかりません。すみません。自分ではこれ以上何をどうすればいいのかよくわからないのでどうかよろしくお願いします。お力をお貸しください。
該当のソースコード
C++
1ソースコード 2//test.cpp 3#include<iostream> 4#include "initialize.h" 5 6using namespace std; 7 8int main(){ 9 Initialize *p; 10 11 p=new Initialize; 12 p->hello(); 13 delete p; 14 15 cout << "hello"<<endl; 16 return 0; 17} 18 19ヘッダファイル 20//initialize.h 21#ifndef _initialize_h 22#define _initialize_h 23class Initialize{ 24 private: 25 public: 26 Initialize(); 27 ~Initialize(); 28 void hello(); 29}; 30#endif 31 32//initialize.cpp 33#include<iostream> 34#include "initialize.h" 35 36using namespace std; 37// 38Initialize::Initialize(){ 39} 40Initialize::~Initialize(){} 41 42void Initialize::hello(){ 43 cout <<"hello from initizelize"<<endl; 44} 45 46
試したこと
mainのポインタに関する記述をコメントアウトし、メンバ関数の呼び出しを変数から行ったら想定通りの結果が得られた。つまり、
hello from Initialize
hello
と出力しました。
//Initialize *p; //p=new Initialize; //p->hello(); //delete p; Initialize init; init.hello(); cout << "hello"<<endl;
試したことその2(追記)
test.cppという名前をwakaran.cppに変え、makefileのtest部分をすべてwakaranに置換しました。
mingw32-make.exe
g++ -Wall -g wakaran.o initialize.o -o tesuto
./tesuto
文章は出てきませんでした。
その後、
mingw32-make.exe clean
をしてみたところ、
process_begin: CreateProcess(NULL, rm tesuto wakaran.o initialize.o, ...) failed.
make (e=2): wウスt@CェゥツゥワケB
makefile:11: recipe for target 'clean' failed
mingw32-make: *** [clean] Error 2
となったので、
rm *o
rm *exe
して再度実行してみたところ、やはりポインタを使うと文章は出力されませんでした。
いずれの場合も、ポインタを使わず変数を使うと想定通り文章が出力されました。その時毎回文章を微妙に変えましたがその通りに出力されました。
試したことその3(追記)
ポインタをよそのファイルのメンバ関数ではなく、本体で整数型の配列を指すポインタにしてみたところ、やはりhelloは出力しませんでした。
C++
1#include <iostream> 2using namespace std; 3 4int main(){ 5 6 cout<<"hello"<<endl; 7 8 int *p; 9 p=new int[10]; 10 delete p; 11 12 //int *p; 13 //p=(int *)malloc(sizeof(int)*10); 14 //free(p); 15}
配列の動的な確保にnewではなくmallocを使ったらhelloは出力されました。
C++
1#include <iostream> 2using namespace std; 3 4int main(){ 5 6 cout<<"hello"<<endl; 7 8 //int *p; 9 //p=new int[10]; 10 //delete p; 11 12 int *p; 13 p=(int *)malloc(sizeof(int)*10); 14 free(p); 15}
環境
実行環境はvisual studio codeを使っています。他にもMinGWやMSYS2を最近ダウンロードしました。(実行環境とはこういうのを指す言葉でしょうか?いまいち自信がありません)
実行手順
makefileを使っています。
内容はこうです。
//makefile tesuto: test.o initialize.o g++ -Wall -g test.o initialize.o -o tesuto test.o: test.cpp initialize.h g++ -Wall -g -c -I./ test.cpp -o test.o initialize.o: initialize.cpp initialize.h g++ -Wall -g -c -I./ initialize.cpp -o initialize.o clean: rm tesuto test.o initialize.o
mingw32-make.exe
./tesuto
で実行しています。
あなたの回答
tips
プレビュー