クラスをヘッダファイルとソースファイルに分けて書く時、ヘッダ側のメンバ関数に仮引数を書く必要はあるのでしょうか?

参考書などを読むと、両方のファイルに同じように仮引数を宣言してありますが、下記のように型だけ指定しても問題なく実装できてしまいます。

class Tes{
public:
  void Foo(int);
};

また、ヘッダ側の仮引数が実装側の仮引数と異なっても、型さえ同じであればこちらも問題なく実装できます。

これらのことから、仮引数は書かなくてもいいのかなと勝手に思ってるわけなんですが、この方法に何か問題はあるのでしょうか?

A 回答 (1件)

仮引数の型は必要ですが、名前はあっても無くても、関数本体と異なっていてもかまいません。


型が違うと別関数になってしまうので問題があるかもしれません。


ちゃんと意味のある名前で、定義と同じにしておくと
・プロトタイプだけを見て、引数の意味がわかる
・IDEがヒントを表示してくれるかもしれない
・プロトタイプと定義とで同じ意味になっている、ということが確認できる。
というあたりが考えられます。

例)
int hoge(int x,int y) ; // xとyを指定する、ということが、プロトタイプでわかる。
...
// 定義
int hoge(int y,int x) {
//(警告もエラーも出ないけど)プロトタイプと見比べたら逆になっているから
//もしかしたら期待した動作になっていないかも、という予想はできる。
....
}
    • good
    • 0
この回答へのお礼

>>名前はあっても無くても、関数本体と異なっていてもかまいません。
ありがとうございます。おかげでスッキリしました。

>>プロトタイプだけを見て、引数の意味がわかる
確かに可読性を考えると、書いてある方がよさそうですね。
自分でちょろっとプログラムを書くならともかく、規模が大きくなりそうなら仮引数名も書こうと思います。
回答ありがとうございました。

お礼日時:2016/03/21 07:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QC++ の typedef の 使い方の質問

C++のtypedefの使い方の質問ですが、typedefは、別名の定義として、知られていますが。
以下のソースの意味がよく読み取れないです。windows プログラミングとC++
が分かるかたがいれば、以下のソースの意味を教えていただきたいです。

よろしくお願いします。
typedef BOOL (WINAPI *AddAccessAllowedAceFn)(
PACL pAcl,
DWORD dwAceRevision,
DWORD AceFlags,
DWORD AccessMask,
PSID pSid
);

Aベストアンサー

関数ポインタの別名定義です。
「関数ポインタ typedef」をキーワードにWeb検索してみてください。
丁寧に解説されているサイトが見つかるでしょう。

Q[VC++][MFC][SDI]ダイアログコントロールもしくわツールバー!!詰まってます!!

現在VC++6.0でMFCを使いSDIのプログラムを作っているのですが、フォームにダイアログバーを張っています。

これをツールバーのように自由に動かしたり、左右上下にドッキングさせたり。
これって実現可能でしょうか?

色々ためしてみたんですが無理でした。
やっぱ不可能ですかね?

これが無理なんであればデフォルトで作成されるツールバー([新規作成][開く][保存]等が入ってる)にコントロール(ボタンやリストボックス)を追加して使用、と考えているのですがこれも難しい!!!


まだまだ未熟者なのですがどうかご存知の方おられましたらご教授ください!!
よろしくお願いします!!

Aベストアンサー

Dannerです。
参考URL(英語)を載せておきます。

参考URL:http://www.codeguru.com/Cpp/controls/toolbar/placingcontrolsintoolbars/article.php/c2505/

QC++.NET の String型の使い方

初めて質問いたします。
C++ .NET 2005 Express Beta版を入手し、Windows Formsのプログラミングを勉強してます。

TextBoxのTextに値を変数で指定したいのですがどうすれば良いのかわかりません。

  textBox1->Text = "Test";
とダイレクトに値を指定すればできるのですが、

  #include <string>
  using namespace std;
   (省略)
  string str = "Test";
  textBox1->Text = str;
は、エラーになってしまいます。

C++標準のstringクラスではなく、.NETはStringクラスがあるようですが、これの使い方がMSDN等で調べているのですが分かりません。
分かりやすいURLなどありましたら教えていただけませんか。

Aベストアンサー

textBox1->Text = new String(str.c_str());
でいけるんじゃないかなあ。
試してないのでなんですが、
C++のstringクラスからは、c_str()で、いわゆるNULL終端文字列へのポインタが得られて
.NETのStringクラスは、NULL終端文字列でのコンストラクタがありますから。

QC++ クラスをメンバにもつクラスについて

お世話になります。C++初心者でうまくコードが書けません(><)
クラス1と2があり、クラス1のメンバにはクラス2があります。
メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。
func2ではクラス1のインスタンスから呼び出された場合にクラス1の
m_int1を取得します。
Class Class1{
public:
 int m_int1;
 Class2 m_Class2;
};
Class Class2{
public: void func2();
};
void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に100を入れる*/
 /*以下間違え*/
 class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/
 C2_1.m_int1 = 100;
}
void main(){
 class1 C1;
 C1.m_int1 = 10;
 C1.m_class2.func();
}
C1.m_class2.func()の中から呼び出したC1にアクセスする方法が
分かりません(TT)。実体がまだあるのだからアクセスする方法は
あると思うのですが・・・
どなたかよろしくお願いします。

お世話になります。C++初心者でうまくコードが書けません(><)
クラス1と2があり、クラス1のメンバにはクラス2があります。
メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。
func2ではクラス1のインスタンスから呼び出された場合にクラス1の
m_int1を取得します。
Class Class1{
public:
 int m_int1;
 Class2 m_Class2;
};
Class Class2{
public: void func2();
};
void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に...続きを読む

Aベストアンサー

おそらくインスタンスに対する勘違いをされていると思います。

void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に100を入れる*/
 /*以下間違え*/
 class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/
 C2_1.m_int1 = 100;
}

ここで行っているのは、あくまで func2関数内のローカル変数として宣言されているC2_1のm_int1に100を代入しているだけで、本来行いたい代入先とは別のインスタンスです。

*解決方1
func に class1のインスタンスを特定できる情報を渡す

public:
void func2 (class1 *ptr);
void func2 (class1 &ptr);
など。

*解決法2
class2 のコンストラクタで、自分をメンバ変数として持ってくれるclass1のポインタ等をもらう。

class class2
{
public:
class2 (class1 *ptr)
: m_ptr (ptr)
{
}
void func ()
{
m_ptr->m_int1 = 100;
}
private:
class1 *m_ptr;
}

です。
ちなみに解決法2ではwarningが発生しますが^^;

おそらくインスタンスに対する勘違いをされていると思います。

void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に100を入れる*/
 /*以下間違え*/
 class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/
 C2_1.m_int1 = 100;
}

ここで行っているのは、あくまで func2関数内のローカル変数として宣言されているC2_1のm_int1に100を代入しているだけで、本来行いたい代入先とは別のインスタンスです。

*解決方1
func に cl...続きを読む

Qc++ stringの使い方

お世話になります。
最近c++始めました。
stringの使い方がよくわかりません。
以下のstringの使い方が問題ないか確認頂けますか。
スマホで書くため、文法が合ってないと思いますが、stringの使い方だけ確認させてください。
引数にstringで囲って渡すのは実装として普通行いますか。
やってはいけないですか。
是非ご教示ください。

#define STR1 "mojiretu"
main()
if(check(string(STR1)))



bool check(string str)

Aベストアンサー

間違っちゃいないけど、直に const string でかまわんのでは?

#include <iostream>
#include <string>

const std::string STR1 = "mojiretu";

bool even_length(const std::string& str) {
return str.length() % 2 == 0;
}

int main() {
if ( even_length(STR1) ) {
std::cout << STR1 << " : even\n";
} else {
std::cout << STR1 << " : odd\n";
}
}

Qchar *name1[4] とchar name2[][4] の違いについて

C言語のことで質問があります。

char *name1[4]は
char *name1[4] = {"abcdefghi","jkl","l","mn"};
と宣言でき,ポインタを4つ確保した形となりました。

char name2[][4]は
char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"};
と4文字以内の文字列を初期化した数だけ確保した形となりました。

この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。
しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。
*name1[4]では4つのポインタを確保できるのに~と思ってしまいます。

ポインタと配列は別物と考えるべきなのでしょうか?
訳の分からない質問かもしれませんが,
何卒ご指導いただくようよろしくお願いします。

Aベストアンサー

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり、この場合のa1は、
変数ではなく、定数のようなものなのです。

複合的なケースについて見てみましょう。
char **q1; ポインタへのポインタ
 q1,*q1,**q1,q1[0],*q1[0],q1[0][0] のいずれも変数として
 扱うことができます。(値を代入することが文法的に許されます。
 ただし、実行時にはアクセス違反になる場合もあります。)
char q2[4][4]; 二次元配列
 q2,q2[0]は変数として扱うことができません。q2[0][0]のように
 して、初めて変数として扱えるようになります。
char *q3[4]; ポインタの配列
 q3は変数として扱うことができませんが、q3[0],*q3[0],q3[0][0]
 はいずれも変数として扱うことができます。
 なお、この定義は char *(q3[4]); とした場合と全く同じ意味です。
char (*q4)[4]; 配列へのポインタ
 q4,(*q4)[0],q4[0][0]はいずれも変数として扱うことができます。
 しかし、*q4,q4[0]は変数として扱うことができません。

char *name1[4]; と char name2[4][]; は確かに似ています。しかし
違うところもあります。それは、name1[0] が変数として扱えるのに
対し、name2[0] には値を代入できないという点です。(データの
具体的な構造については、inthefloiさんが書いておられる通りです。
> char name2[4][]ではポインタを4つ確保した事にはならないみたい
というのも、全くその通りで、配列の定義では、ポインタ変数の領域
を確保する余地はないのです。

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり...続きを読む

QVisial C++おけるπの使い方

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(void){
int i,n,count=0;
double x,y,r,error;

srand((unsigned)time(NULL)); /*乱数の初期化*/

printf("How many trials?");
scanf("&d",&n);

for(i=0;i<n;i++){
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);

if(y<sin(M_PI*x)){
count++;
}
}

r=(double)count/n; /*キャスト演算子を使用*/
error=2/M_PI-r;

printf("Result is %f (Error: %f)\n",r,error);

return 0;
}

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include ...続きを読む

Aベストアンサー

★アドバイス
・math.hをインクルードする前に『_USE_MATH_DEFINES』定数を define します。

#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main( void )
{
 :
 return 0;
}
必ず include する前に定義して下さい。

Q派生クラスのメンバを基底クラスの参照に代入(C++

文末のコードのように、
基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。
(classではなくstructにしているのは質問上でのpublic:の省略のためだけです)

初期化順序的には、基底クラスの参照先は、
基底クラスのコンストラクタが走る時点で初期化されていないので、
コンストラクタ内で参照に対して何かしようとすると問題になると思っています。

基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、
参照は有効で、派生クラスのコンストラクタ実行後であれば
問題なく動くと思ってよいでしょうか。

struct A {

int& m_ref;

A(int& ref) : m_ref(ref) { }

};

struct B : public A {

int m_obj;

B() : A(m_obj) { }

};

Aベストアンサー

継承は、子が親を知っている状態です。
お話しされているクラスは、親が子を知っている状態で、関係が反転しています。
これは非常に難解な状況で、子の処理結果を親が受け取りたいということなら、
テンプレートメソッドなどで対応するべきです。

QcygwinでのC++の使い方

cygwinでC言語で書いたプログラムを実行したいのですがcygwinを起動すると
私の名前@なにやらアルファベット
が表示され次の行に

と表示されるんですがこの後にどんなことを書けば
#include<・・・>
としてC++のプログラムを書いていくことができるんですか?そもそもcygwinの使い方が根本的に違うんですかねえ?それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?とりあえずプログラムを実行できるようにしてください。おねがいします。

Aベストアンサー

> それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?

おおむねその通りです。

メモ帳でも何でもよいので、エディタでソースファイルを作成してください。作成したソースファイルは、とりあえずホームディレクトリに格納するとよいでしょう(C:\cygwinにCygwinをインストールしたのであれば、C:\cygwin\home\アカウント名がホームディレクトリになります)。

作成したソースファイルがfoo.cppだった場合、

g++ foo.cpp

とすれば、a.exeという実行ファイルが同じディレクトリにできるはずです。そこで、

./a

と入力すれば、a.exeを実行することができます。

Q【C++クラス設計】ある関数の引数に、他のクラスのメンバ関数を呼び出す方法【教えて下さい】

C++でクラス設計のコードを書いています。
隠蔽性を大事にするため、(特に必要がない他は)最初からメンバ変数は全てprotected(private)のメンバとして宣言し、getter/setter関数で操作しています。

クラスABCのメンバ関数の引数として、クラスXYZのメンバ関数を呼び出すとき、問題が発生します。
クラスABCのメンバ関数の引数に呼び出した、クラスXYZのget関数によって正しい値が渡されず、引数に意味のない数字が渡されてしまいます。

一方同じ設計で、クラスXYZのメンバ変数をpublicで宣言し(getter関数を使わず変数本体だけ)直接渡すと、意図した決められた値が渡されます。
よって関数の引数に他のクラスの関数を呼び出すときに限りエラーが起きていると思われます。

コードは以下の通りです。
<ABC.h>
class ABC{
public:
void A(int);
};

<ABC.cpp>
#include"ABC.h"
void ABC::A(int i){ printf("%d", i); }

<XYZ.h>
class XYZ{
protected:
static int X;
public:
static int getX(){return X;}
};

<XYZ.cpp>
#include"XYZ.h"
int XYZ::X;

<MAIN.cpp>
#include"ABC.h"
#include"XYZ.h"
int main(void){
ABC abc;
XYZ xyz;
abc.A(xyz.getX); //この行のgetX関数で正しい値が渡されてない(public変数はok)
return 0;
}

クラス設計の隠蔽性を大事に(メンバ変数をprotectedに)したまま、クラスABCのメンバ関数の引数に、クラスXYZのメンバ関数によって正しい値が渡される方法を教えてください。

C++でクラス設計のコードを書いています。
隠蔽性を大事にするため、(特に必要がない他は)最初からメンバ変数は全てprotected(private)のメンバとして宣言し、getter/setter関数で操作しています。

クラスABCのメンバ関数の引数として、クラスXYZのメンバ関数を呼び出すとき、問題が発生します。
クラスABCのメンバ関数の引数に呼び出した、クラスXYZのget関数によって正しい値が渡されず、引数に意味のない数字が渡されてしまいます。

一方同じ設計で、クラスXYZのメンバ変数をpublicで宣言し(getter...続きを読む

Aベストアンサー

誤: xyz.getX
正: xyz.getX()

または

C++/CLI の property 構文を使う


人気Q&Aランキング