お世話になります。
質問させて頂きたいことは
複数のクラスで共通して使われる関数、変数があった場合、その関数、変数は私の中で次の2通りの方法が思い当たったのですがどちらのほうがメモリ等の使用からよいのでしょうか?
1つめは
あるヘッダファイル****.hを作成し、その中で関数を宣言し、変数はそのヘッダファイルのソースファイル中のグローバル変数とする。
2つめは
クラスを作成し、静的メンバ関数、静的メンバ変数とする。

ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、静的メンバを今まで使ったことがないので、このような用途に使われるべきなのかも正直わかっていません。

検討外れのことを言っているのかもしれませんが、教えて頂ければと思っております。宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

本当に共通して使われる関数があるなら単なるC言語的な関数で良いと思いますのでクラス化する必要は有りません。

ただし、データ保持する変数と組になる関数であるならばクラス化を考えてください。
例えば日付を処理する関数と日付を保持する変数があるなら、それは1つのオブジェクトで1つのクラスとすべきです。

>ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、

安易なグローバル変数を避けることはコードの見通しやバグの削減につながるので良いことですが、むやみにグローバル変数をやめて逆に複雑になるなら避けたほうが良いです。

と言うことで私の答えは1でも2でも無い3です。
変数と関数を組とした1つのクラスとして、そのクラスのインスタンスをグローバル変数として宣言してください。
    • good
    • 0
この回答へのお礼

今回質問させて頂いた関数というのはレジスタに設定データを書き込んだり、読み込んだりする関数で、変数というのはその設定データを一時的に格納する構造体なんです。

静的関数、静的変数を考える前はおっしゃるようにこれらを1つのクラスとし、クラスのインスタンスを作成していたのですが、それだとそのインスタンスが開放されるまでインスタンス分メモリがとられてしまう為、なるべくメモリの消費をしないようなプログラムにしようと思っています。それで今回のようなことを考えてみたのですが。。
これだと、クラスの中身が静的変数と静的関数のみで、これでいいのだろうかと不安に感じているのですが、やはり普通にクラスにし、インスタンスを作成するのが妥当なのでしょうか?

お礼日時:2009/05/26 16:54

>静的関数のみなので、インスタンスを作ってはいけないというのはわかるのですが、スレッドや割り込みで使ってはいけないというのはなぜでしょうか?グローバル関数、変数とほとんど大差がないような気がするのですが。

。。

失礼。少し失言でした。
クリティカルセクション等でガードすれば問題なく使えます。

>CだとMFCのような画面構成の作成ができない為、ちょっとCには出来ないです。
???
C言語の関数記述はC++コンパイラでも使えます。当然、VC++でも使えますよ。
int sub(int in)
{
return in+1;
}
をメンバ関数から呼び出せます。
int class::member(int in)
{
return sub(in);
}
    • good
    • 0
この回答へのお礼

>クリティカルセクション等でガードすれば問題なく使えます。
なるほど、グローバル変数・関数と同じように衝突しないように気をつけろということですね。

C言語の記述をVCに書いては、という話だったんですね。
勘違いして、Cのみで作成しては、という話かと思ってしまいました。理解不足でした。
ヒープということは、mallocとかをつかってメモリ確保しては?という話なのでしょうか?

お礼日時:2009/05/27 11:11

メモリの使用量ですが、大差ないです。


この場合は、デザイン(設計)を重視するべきじゃないですかね。
なんなく、継承とかよりも、単独のオブジェクトとした方が
よさげな予感はします。
あとは、シングルトンなり、コンポジットなり用途次第で。。。

ちなみに、プログラム実行時には、
当然実行ファイル自体のファイルサイズ分メモリを使用しますから
C++を選択する時点でメモリの使用量はおさえられないと考えた方がよいです。

ということで、メモリ使用量を抑えたいというのならば、
Cで、ヒープ使うのが一番無難じゃないですか?

# s/レジスタ/レジストリ/ とか思ってみる今日この頃
    • good
    • 0
この回答へのお礼

クラスの継承は共通の動作をする関数が複数のクラスで必要な場合に有効なようですね。
よくよく考えてみたら、それぞれのクラスでレジストリの読み書きという処理は同じですが、レジストリの保存先や、読み込んできたデータを格納する構造体が違っているため継承は今回のプログラムには向いていないみたいです。

CだとMFCのような画面構成の作成ができない為、ちょっとCには出来ないです。。

ご回答ありがとうございました。

お礼日時:2009/05/27 09:17

決してインスタンスを作らない&スレッドや割り込みで使わない事さえ心がければ罠は無いとは思います。

将来誰かの手でメンテされる可能性があるならコメントで正確に記載しておいてください。ただ、私の感想としてはクラスとしては気持ち悪いですね。
    • good
    • 0
この回答へのお礼

やはりクラスとしては気持ち悪いですよね。
私も出来上がったクラスの整然と並んでるstaticを見て、不気味に感じました。。

>決してインスタンスを作らない&スレッドや割り込みで使わない事さえ心がければ罠は無いとは思います
静的関数のみなので、インスタンスを作ってはいけないというのはわかるのですが、スレッドや割り込みで使ってはいけないというのはなぜでしょうか?グローバル関数、変数とほとんど大差がないような気がするのですが。。。
ご回答宜しくお願い致します。

お礼日時:2009/05/27 09:06

>今回質問させて頂いた関数というのはレジスタに設定データを書き込んだり、読み込んだりする関数で、変数というのはその設定データを一時的に格納する構造体なんです。



レジスタ?って事はマイコン?ですかね。周辺IOの制御レジスタだと思うんですが。メモリ消費を抑えたいという点からもマイコンっぽいですが。
設定データの受け渡しなら構造体パラメータを読み書きの関数に渡すのはだめなんでしょうか?わざわざグローバル変数である意味が分かりません。
それとインスタンスはスコープ外に出ればメモリから消滅しますので、ローカル変数で宣言すればその関数を抜ければ消滅します。
それでもメモリ消費が多いというなら、C言語の関数で書いたほうがメモリが少ないかも知れません。

ちなみにstaticな関数や変数だとインスタンス関係なしに実態が存在する事になります。まぁ単なるC関数と変数と同じでクラス名::メンバ名でアクセス出来てしまいます。
    • good
    • 0
この回答へのお礼

レジスタといってもマイコンでありません、組み込み機器のアプリケーションを開発しています。
ただ、通常のPCではなく組み込み機器用のOSで開発している為、メモリに対しては敏感であったほうがいいと思い、プログラムでのメモリの消費を気にしています。
レジスタに変数を格納するのは、一度機器の電源が切れても設定データを保持させたい為です。

おっしゃる通りstaticな関数、変数だとインスタンスを関係なく使用できるため、インスタンス用にメモリを消費させなくて良いと思ったため、静的関数・変数にこだわってみました。

とりあえずは静的関数、変数でプログラムを作ってみたのですが、静的関数・変数を使うことで生じる問題等ということはりますでしょうか?
重ねての質問で申し訳ありませんが、お答え頂ければと思っております。

お礼日時:2009/05/26 18:07

私だったら、その共通の関数をメンバとして持つクラスを作って、それを継承して使うことを考えます。


単純な継承でもいいし、多重継承もありでしょう。
    • good
    • 0
この回答へのお礼

その前の方に対しても説明させて頂いたのですが、共通の関数というのがレジスタの読み書きをする関数、変数はそれを一時的に保存する構造体なのですが、そのような関数でも継承を使うことが有効なのでしょうか?
継承はほとんど触れておらず、なんとなくのイメージしかもっていないのですが、もし継承した場合だと、子のクラスは親のクラスの関数(今でいうレジスタ操作の関数)をメモリ消費なしに普通に呼び出せるのでしょうか?

お礼日時:2009/05/26 16:58

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

Qエクセルで種類を数える関数が無いのは何故?

エクセルで種類を数える関数が無いのは何故なんでしょうか?

エクセルで種類を数えるには、いくつかの関数を組み合わせるのが一般的ですよね?
直接数える関数が無いのは、訳があるんでしょうか?

Aベストアンサー

>>エクセルで種類を数える関数が無いのは何故なんでしょうか?

やっぱり、そういう関数が必要な方が全体からみたら少数派だと、エクセルの開発者たちが考えているからではないかと思います。
また、既存の関数を組み合わせたら、対処可能だから、無理して新しい関数を作る必要性もない、開発の優先順位が低いって判断もあるでしょうね。

私は、エクセルの表を作ったり、エクセルVBAでプログラムを作ったりしますけど、そういう関数が必要になったことが全くありませんし。

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エクセルの関数で

エクセルの関数辞典を見ていたら、CUMPRINC関数というのがありました。
しかし、エクセルの「挿入」→「関数」→関数の分類で「財務」というのを選択したのですが、一覧表に載っていません。
どこに載っているのでしょうか?
どうすればこの関数を使えますか?
ちなみにシートの上でやっても関数の反応をしませんでした。

Aベストアンサー

Yahooで検索してみると、参考URLが引っかかりました。

参考になりませんか?

参考URL:http://money-sense.net/doc/20041215_224257.php

Qヘッダファイルの外側にメンバ関数を定義する時のinline指定について

main.cpp、DUT.cppを分割コンパイルした場合、リンク時に
main.o(.text+0x0): In function `DUT::FuncA()':
<省略>/DUT.h:12: multiple definition of `DUT::FuncA()'
DUT.o(.text+0x0):<省略>/DUT.h:12: first defined here
collect2: ld returned 1 exit status
とエラーが出ます。FuncA関数をインライン指定するとリンクエラーはなくなります。

インライン指定しないと関数の実体がDUT.cpp/main.cppコンパイル毎に生成され、リンク時に衝突してしまう感覚はなんとなくわかるのですが、インライン指定時にFuncA関数の中身はどこに存在しているのでしょうか。

nm/objdumpで見ても見つかりません。
どういうメモリ構造故、インライン指定時には問題が起きていないのか、どこにFuncA関数の実体はあるのかを教えていただけないでしょうか。


// DUT.h
#ifndef TLM_DUT_H
#define TLM_DUT_H
class DUT{ public:
void FuncA() ;
int ValB ;
} ;
inline // インライン指定しないとコンパイルエラー
void DUT::FuncA(){
...
}
#endif

// DUT.cpp
#include "DUT.h"

// main.cpp
#include "DUT.h"
int main( int, char** ){
return 0;
}

% make
g++ -g -Wall -c DUT.cpp
g++ -g -Wall -c main.cpp
g++ -g -Wall -o run.x DUT.o main.o 2>&1 | c++filt
main.o(.text+0x0): In function `DUT::FuncA()':
<省略>/DUT.h:12: multiple definition of `DUT::FuncA()'
DUT.o(.text+0x0):<省略>/DUT.h:12: first defined here
collect2: ld returned 1 exit status

main.cpp、DUT.cppを分割コンパイルした場合、リンク時に
main.o(.text+0x0): In function `DUT::FuncA()':
<省略>/DUT.h:12: multiple definition of `DUT::FuncA()'
DUT.o(.text+0x0):<省略>/DUT.h:12: first defined here
collect2: ld returned 1 exit status
とエラーが出ます。FuncA関数をインライン指定するとリンクエラーはなくなります。

インライン指定しないと関数の実体がDUT.cpp/main.cppコンパイル毎に生成され、リンク時に衝突してしまう感覚はなんとなくわかるのですが、インライン指定時...続きを読む

Aベストアンサー

inline指定子を付けた場合でも、関数はデフォルトでは外部結合になります。そして、インライン置換されなかったインライン関数(例えば、再帰呼出しを行ったり、インライン関数へのポインタを取得した場合)や、インライン関数の中で定義された静的記憶域期間を持つオブジェクトは、リンク時に一箇所にまとめられます。

実際にコンパイル結果を調べたり、リンク後にnmを使って関数が配置されたアドレスを調べれば分かります。

Qエクセルの関数 ネスト

エクセルの関数 ネスト

エクセルの関数で、ネストさせるときがあるとおもうのですが、

関数を内側に書いたらよいのか外側に書いたらよいのか分からなくなる時があります。

エクセルの関数に関してわかりやすく書いてあるページなどありますか。

Aベストアンサー

こんばんは

Excel2003までは、ネストが7まで、2007では64までが可能です。
http://www.google.co.jp/search?hl=ja&source=hp&q=excel+%E3%83%8D%E3%82%B9%E3%83%88%E3%80%802003%E3%80%802007&aq=f&aqi=&aql=&oq=&gs_rfai=

「仕様上は可能」でも、複雑なネストは間違いが生じやすいですし、変更もしにくくなります。「出来るだけネストはしない」「適宜、中間結果をセルに出力する」という方法を採った方が、間違いが少なく、柔軟性のあるシステムになると思います。

>エクセルの関数に関してわかりやすく書いてあるページなどありますか。
関数の個別の機能ならば、Webサイトも書籍も多数あるのですが、「組み合わせて使う」というのはその場その場での発想になってしまうと思います。

Qメンバ変数が変更されそうなconstメンバ関数

c++のconstメンバ関数についての質問です。
以下のコードの様に、constメンバ関数で
メンバ変数を変更しているように見える場合、
本来はどのように記述すべきか?

class foo
{
public:
foo(){}
foo(int i){ d = i; }
void hoge(foo *dest0, foo *dest1 ) const
{
dest0->d = d*2;
dest1->d = d*4;
}

int d;
};

int main()
{
foo f(1);
foo p,q;

f.hoge(&p,&q);

std::cout << f.d << "\n";
std::cout << p.d << "\n";
std::cout << q.d << "\n";


f.hoge(&f,&q);
std::cout << f.d << "\n";
std::cout << q.d << "\n";


return 0;
}

ちなみに出力期待値は
1
2
4
2
4
とします。
上のコードは
1
2
3
2
8
と出力されますが、このようなことが無いように実装するには
どうすべきかという質問です。
dest0->d = d*2;
dest1->d = d*4;
の所を
int i=d;
dest0->d = i*2;
dest1->d = i*4;
とすべき?
それともhogeの最初に
if( (this == dest0) || (this == dest1) || (dest0== dest1) ){
throw "同じオブジェクトじゃだめ";
}
とすべき?
どんな書き方が安定でしょうか?

c++のconstメンバ関数についての質問です。
以下のコードの様に、constメンバ関数で
メンバ変数を変更しているように見える場合、
本来はどのように記述すべきか?

class foo
{
public:
foo(){}
foo(int i){ d = i; }
void hoge(foo *dest0, foo *dest1 ) const
{
dest0->d = d*2;
dest1->d = d*4;
}

int d;
};

int main()
{
foo f(1);
foo p,q;

f.hoge(&p,&q);

std::cout << f.d << "\n";
std::cout << p.d << "\n";
std::cout << q.d << "\n";


f.hoge(&f,&q);
std::cout...続きを読む

Aベストアンサー

「意味からいって同じオブジェクトを指定できるかどうか」がまず問題で, 「同じオブジェクトを指定する意味がある」なら前者, 「無意味である」あるいは「してはならない」なら後者の形になるんでは?
もっとも, このようなメンバー関数を作らなければならないとしたら「設計が間違っている」ような気もするんだけど....

Qエクセル関数の解読サイトなんてありますか?

エクセル関数の解読サイトなんてありますか?

いつもお世話になっております<(_ _)>

エクセルファイルに関数の入った数式が入力されています。
セルごとに複数の関数が入っていますが、私にはちっともわかりません。

そこで質問です。
こんなとき「エクセル関数を解読」してくれるようなサイトってありませんか?

たとえば検索窓があってそこに「=SUM(S1:S13)」わからなくて困っている関数式を入力。
すると答えの別ボックスに「S1~S13までの数値の合計」と出てくるようなサイト。

それに近いサイトでも良いので知っている方がいらっしゃればぜひ、教えてください<(_ _)>

Aベストアンサー

もし、

=IF(E14="","",IF(O14="",(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1300,(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1625))

だったら、どういう文章が出て欲しいのでしょうか?

もしE14が空白だったら、
 空白、
そうじゃなかったから、
 もしO14が空白だったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1300
 そうじゃなかったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1625

って感じですか?
数式をそのまま読解したほうが解りやすくないですか?

Q基本クラスのポインタから、特定の派生クラスのメンバ変数を変更する方法?

VC++でプログラミングをしています。
A(基本クラス)
A1, A2, A3, ...(派生クラス)
を作成しました。A1,A2,A3, ...は、Aの派生クラスです。

このとき、基本クラスAのポインタから、特定の派生クラスにのみ存在するメンバ変数m_dataのみ変更したいのですが、存在するかどうかをどのように判定して、値を変更すれば良いでしょうか?

できれば、下記のような構造でループできるとありがたいです。

A* a[100]
(その後、a[100]に、派生クラスA1,A2,A3,..を割り当て、
 それらが、混在しているとします。)

for(i=0 ; i<100 ; i++){
if(a[i]->m_dataが存在する場合){ (2)
  a[i]->Set_m_data("m_dataの新しい値") (1)
 }
}

(1)は、a[i]->m_data = "m_dataの新しい値"
でも良いです。

現状では、m_dataがメンバでない派生クラスがあるので、
(2)のif文の判定自体ができず困っています。

よろしく御願いします。

VC++でプログラミングをしています。
A(基本クラス)
A1, A2, A3, ...(派生クラス)
を作成しました。A1,A2,A3, ...は、Aの派生クラスです。

このとき、基本クラスAのポインタから、特定の派生クラスにのみ存在するメンバ変数m_dataのみ変更したいのですが、存在するかどうかをどのように判定して、値を変更すれば良いでしょうか?

できれば、下記のような構造でループできるとありがたいです。

A* a[100]
(その後、a[100]に、派生クラスA1,A2,A3,..を割り当て、
 それらが、混在しているとし...続きを読む

Aベストアンサー

言語仕様的はメンバ変数の存在を確認する方法は無いです。
(処理系依存でも良いならば全く無いわけではありませんが…)

よって別のアプローチで
(1)仮装関数を利用して別個に処理させる
class A{
public:
   virtual Set_m_data(M_DATA &Adata){
      //何も入れない。空の処理
   }
};

class A1{ //メンバ無し
public:
   //何も作らない
};

class A2{ //メンバ有り
private:
   M_DATA m_data;
public:
   virtual Set_m_data(M_DATA &Adata){
      m_data = Adata;
   }
};
//代入処理
for(i=0 ; i<100 ; i++){
   a[i]->Set_m_data(m_dataの新しい値);//チェックする必要もない
}


(2)基底クラスAにm_data型のポインタを用意してそれで判別
class A{
public:
   M_DATA *pm_data:
   A(){//コンストラクタ
      pm_data = NULL; //NULLならばデータ無し
   }
};

class A1{ //メンバ無し
public:
   //何も作らない
};

class A2{ //メンバ有り
private:
   M_DATA m_data;
public:
   A2(){//コンストラクタ
      pm_data = &m_data; //NULLでない場合はデータ有り
   }
};


//代入処理
for(i=0 ; i<100 ; i++){
   if(a[i]->pm_data){//ここがNULLならばメンバ無しと判定できる
      *(a[i]->pm_data) = m_dataの新しい値; //そのまま代入も可能
   }
}

言語仕様的はメンバ変数の存在を確認する方法は無いです。
(処理系依存でも良いならば全く無いわけではありませんが…)

よって別のアプローチで
(1)仮装関数を利用して別個に処理させる
class A{
public:
   virtual Set_m_data(M_DATA &Adata){
      //何も入れない。空の処理
   }
};

class A1{ //メンバ無し
public:
   //何も作らない
};

class A2{ //メンバ有り
private:
   M_DATA m_data;
public:
   virtual Set_m_data(M_DATA &Adata){
      m_d...続きを読む

Qエクセル関数を、書き写して分析できるツールはある?

タイトルの件、質問します。

エクセルの関数を分析する際に、エクセルの数式バーや、セルに入っている関数を
F2を教えて見るのでは、見にくい場合があります。

現在は、私は、メモ帳に関数をコピーして、分析したり、修正したりしています。
エクセルの機能or他ソフトで、関数を分析できるツールはあるのでしょうか??

【エクセルバージョン】
2003、2007

Aベストアンサー

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利な方法です。
そもそも計算が通っていない(たとえばカッコの対応が間違えていて,Enterしても受け付けてくれないようなミスをしている場合)には使えません。



また,数式バーの中で数式の「中」にカーソルを入れて左右の矢印キーでカーソルを動かしていったときに,「(」や「)」をまたいだ瞬間に,対応する「閉じカッコ」「始まりのカッコ」が色つきで強調表示されるのを確認しながら,カッコの対応がまちがえてないかなどを調べるのも簡易な良い方法です。


あまり使わない方法ですが,数式の中で適宜ALT+Enterを打って「セル内改行」してしまい,数式を縦に分解して書いてみるのも整理しやすい方法のひとつです。

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利...続きを読む

Q基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

VC++でプログラミングをしています。
A(基本クラス)
B(派生クラス)
を作成しました。Bは、Aの特別な場合です。

このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか?

基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。
(純粋仮想関数という方法もあるようですが、)

操作としましては、
Aのポインタ配列 A* a[100]を作成し
特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。
派生クラスにのみあるメンバ関数を、Readとします。

for(i=0;i<100;i++){
if(派生クラスBの場合){
a[i]->Read()
}
}

現状では、コンパイルエラーで、
関数Readは、aのメンバ関数ではありませんとなってしまいます。
以上よろしくお願いします。

Aベストアンサー

>この関数は、基本クラスには不要なので、
>できれば使わないメンバ関数を基本クラスに書きたくありません。

その動機付けがよくわからないのですが、もう少し具体的な話があれば補足にどうぞ。


>for(i=0;i<100;i++){
> if(派生クラスBの場合){
>  a[i]->Read();
> }
>}

これだけ見ると、基底クラス A に何もしない仮想関数 A::Read() を用意して、
これを派生クラス B でオーバーライドすれば if 文不要で

for ( i = 0 ; i < 100 ; i++ ) {
 a[i]->Read(); // a[i] が派生クラス B を指すときのみ Read()が意味のある処理をする
}

となるから、そちらの方が(効率はさておき)優れていると思いますけど。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報