c++で抽象クラスを使ったときのリンクエラー
以下のブログの内容と全く同じミスをしてた.分かってるつもりだったのに気づかないものですね.自分への戒めに記録しておきます.
eclipse+CDT+EGitで過去のコミットメッセージを編集したい
過去のコミットメッセージ(コミットログ)を編集したいとき,コマンドラインだったら
$ git commit --amend
でいいけど,EGitの場合どこでやるのかよく分からなかった.
で,以下のページを見たらなんとなく分かった.
チームからコミットする
右上に示した矢印のボタンを押す
これだけです.
この方法で編集できるのは直前のコミットのコミットメッセージ限定かな.
std::priority_queueでアボート
まだ原因を探し中だけど,一時的にメモ.
std::priority_queueを使っているんだけど,メモリ解放時にアボートしたり,push()しようするとアボートしたりと色々よく分からない.
あと,手元のmac miniだときちんと動くのに,Linuxマシンに持って行くと,このアボート祭りが起こるというところも謎.STL使っときゃメモリのことそんな意識しなくても良くね?良くねー!!
以下の記事によると,コンパイル時に_GLIBCXX_DEBUGマクロを有効にすれば,デバッグモードでのコンパイルになり,誤ったSTLの使用方法をしている場所があったらそこでプログラムがabortしてくれるということで,是非やってみたいんだけど,
http://habu1010.tumblr.com/post/21431491270/g-stl
BOOSTを使っていると(ライブラリを使っていると),あんまり簡単じゃないみたいで,そこらへんは以下の記事たちが参考になりそう.
stack over flow - Boost Program Options won't work with GLIBCXX_DEBUG
http://stackoverflow.com/questions/19729036/boost-program-options-wont-work-with-glibcxx-debug
stack over flow - Using GLIBCXX_DEBUG for user code but not with libraries
http://stackoverflow.com/questions/14040588/using-glibcxx-debug-for-user-code-but-not-with-libraries
なんとかしたい.
クラスのメンバに別のクラスのオブジェクトを持っているとき、いつコンストラクタを呼び出せばいいの?
もうほんとこれもタイトルとおりでして.
今までやったことなかったから分からなかった.常識的なことなはずだけど,教えられないと分からないですよね.聞いてねーよ!っていう.早くこういう初歩的なゾーンを抜け出したい.
で,以下のページを見たら一発解決した.
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02022.html
ロベールさんマジサンクス.
eclipse+CDTで他プロジェクトのソースファイルをコピー(インポート)せずに利用したい場合
検索しても日本語のページが出てきませんでした.多分私の検索能力の問題ですね......
以下のリンクにやり方が書いてありました.
http://stackoverflow.com/questions/13824381/eclipse-cdt-add-existing-source-wihtout-copying
編集:
今考えると、「他プロジェクトのソースファイルを利用したい場合」というのは、その利用したいソースファイルが再利用される可能性があるということなので、ライブラリ化(LinuxでC++なら.aとか.so、Javaなら.jarファイルを作る)するべき。やり方がなかなか出てこないわけだ。
自分でライブラリを作って、それを他のプロジェクトがリンクして利用する、という話はネット上にいっぱい参考になる記事があるので、そちらをご参照ください。
const参照で渡されたオブジェクトにはconst_iteratorを使う
const参照で渡されたvectorオブジェクトのイテレータをインスタンス化しようとしたら,以下のようなエラーが出ました.
ソースの一部
void HOGE::hoge( const std::vector< int >& q ) {
for ( std::vector< int >::iterator q_itr = q.begin(); q_itr != q.end(); ++q_itr ) {
......
}
}
エラー
> error: conversion from '__gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >' to non-scalar type '__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >' requested
この場合,イテレータの型が間違っているので,const_iteratorを使えばいいんですね.
std::vector< int >::const_iterator q_itr = q.begin();
c++での関数ポインタ
c++の関数ポインタ(メンバ関数ポインタ)についてちょっと練習. ポインタ型を宣言する時,クラスまで指定するのでCの関数ポインタよりも安全だそう.
以下のソース(func_pointer.hpp, func_pointer.cpp)は関数ポインタの旨みみたいのを活かしてるとは言えないと思うんだけど,とりあえず今やりたいことを実現するにはこれで十分かな?
ヘッダ:func_pointer.hpp
namespace FP {
class Func_pointer
{
private:
int add( int a, int b ); /// 加算を行うメソッド
int sub( int a, int b ); /// 減算を行うメソッド
int multi( int a, int b ); /// 乗算を行うメソッド
int (Func_pointer::*func_ptr)( int a, int b ); /// 関数ポインタfunc_ptrの宣言.関数ポインタ自体はprivateとする
public:
enum METHOD { ADD=0, SUB, MULTI };
Func_pointer() { func_ptr = &Func_pointer::add; }; /// コンストラクタでは適当に加算メソッドを選択しておく
void select_func( Func_pointer::METHOD mode ); /// 計算方法を選択するメソッド
int caluculate( int a, int b ); /// 計算メソッド
};
}
ソース:func_pointer.cpp
#include <iostream>
#include "func_pointer.hpp"
using namespace FP;
int main( void ) {
Func_pointer test;
int a = 10; int b = 5;
/// 加算
Func_pointer::METHOD mode = Func_pointer::ADD;
test.select_func( mode );
std::cout << "The answer is " << test.caluculate( a, b ) << "." << std::endl;
/// 減算
mode = Func_pointer::SUB;
test.select_func( mode );
std::cout << "The answer is " << test.caluculate( a, b ) << "." << std::endl;
/// 乗算
mode = Func_pointer::MULTI;
test.select_func( mode );
std::cout << "The answer is " << test.caluculate( a, b ) << "." << std::endl;
return 0;
}
int Func_pointer::add( int a, int b ) {
return a+b;
}
int Func_pointer::sub( int a, int b ) {
return a-b;
}
int Func_pointer::multi( int a, int b ) {
return a*b;
}
void Func_pointer::select_func( Func_pointer::METHOD mode ) {
switch ( mode ) {
case Func_pointer::ADD:
func_ptr = &Func_pointer::add;
break;
case Func_pointer::SUB:
func_ptr = &Func_pointer::sub;
break;
case Func_pointer::MULTI:
func_ptr = &Func_pointer::multi;
break;
default:
std::cout << "Illegal mode selection." << std::endl;
exit(0);
}
}
int Func_pointer::caluculate( int a, int b ) {
return (this->*func_ptr)( a, b ); /// どのインスタンスの関数ポインタかを指定するため,thisが必要
}
実行結果:
The answer is 15.
The answer is 5.
The answer is 50.
うん,うまくいってますね.今日はイライラせずに済んだ.
以下のページを参考にさせていただきました.