2017-12-01 5 views
1

固定サイズのベクトル/行列に作用するライブラリ(つまり、関数の集合)を構築したいと考えています。ライブラリに触れずに、この固定サイズをメインファイルに指定したいと思います。私は#defineを使ってこれを行うことができましたが、私はこのアプローチを「正しい」方法ではなくハックと見ています。この目標を達成するために他にどのようなアプローチが必要ですか?このアイデアは、一度ライブラリを書いてから、一度も触れないようにしたり、もう一度見たりすることです。ここで#defineに依存せずに配列のサイズを宣言するには?

には、次のおもちゃの一例であり、program.cpp

//program.cpp -- Definition of my_external_constant here 
const unsigned int array_size = 10; 
#define my_external_constant array_size // I am looking for alternatives. 
#include "helper.h" 

int main(int argc, char* argv[]) { 

    test_function1(); 

    unsigned int X[array_size]; 
    X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0; 
    print_vector(X,3); 

    return 0; 
} 

その後helper.h

//helper.h 
#ifndef HELPER_H 
#define HELPER_H 

#include<iostream> 

#ifndef my_external_constant // I want to avoid this... 
#define my_external_constant 1 //...and this... 
#endif       //...and this. 

void test_function1(void); 

//The library uses helper_max_size everywhere, and its value is inherited from outside. 
const unsigned int helper_max_size = my_external_constant; 
void print_vector(unsigned int[helper_max_size], const unsigned int); 

#endif /* HELPER_H */ 

と実装helper.cpp

//helper.cpp 
#include "helper.h" 

void test_function1(void) { 
    std::cout << "Hello world!\n"; 
    return; 
} 

void print_vector(unsigned int my_vector[helper_max_size], const unsigned int my_size) { 

    for (unsigned int i=0;i<my_size;++i) { 
     std::cout << my_vector[i] << " "; 
    } 
    std::cout << "\n"; 

    return; 
} 

は、プログラムはで構成する必要があります1つの翻訳単位のみです。つまり、行に沿ってコンパイルする必要があります。

g++ -o program program.cpp helper.h helper.cpp 

関連:

How do I use extern to share variables between source files?

Declare array size in header file without #define's

+0

「プログラムは、単一の変換ユニットで構成する必要があり、すなわち、それが線に沿ってコンパイルされなければなりません」。 – tkausl

+2

あなたはC++を使い始めることができます;)...例えば、あなたの行列型テンプレートを(サイズをパラメータにして)作成します。もしあなたが固定サイズの配列を持っていれば、あなたは 'std :: array'をどうにか使ってください。 – user463035818

答えて

4

私は図書館に触れることなく、メインのファイルで、この固定サイズを指定します。

アイデアは、ライブラリを一度書き、一度触れないようにしたり、もう一度見たりすることです。

ライブラリのすべてのユーティリティと機能をアレイのサイズに合わせてパラメタ化します。例:現代のC++では

// helper.h 
template <std::size_t N> 
void print_vector(unsigned int(&array)[N], const unsigned int) { /* ... */ } 

// program.cpp 
#include <cstddef> 
#include "helper.h" 

constexpr std::size_t array_size = 10; 

int main(int argc, char* argv[]) 
{ 
    test_function1(); 

    unsigned int X[array_size]; 
    X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0; 
    print_vector(X, 3); 
} 

、あなたはCスタイルの配列上std::arrayを好む必要があります。サイズ変更可能な配列が必要な場合は、std::vectorを使用することもできます。しかしそれでも複数の翻訳単位:例えば:

// helper.h 
template <std::size_t N> 
void print_vector(const std::array<unsigned int, N>& array, const unsigned int) 
{ 
    /* ... */ 
} 

// program.cpp 
#include <cstddef> 
#include "helper.h" 

constexpr std::size_t array_size = 10; 

int main(int argc, char* argv[]) 
{ 
    test_function1(); 

    std::array<unsigned int, array_size> X; 
    X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0; 
    print_vector(X, 3); 
} 
+0

関数のパラメータとして渡された生の配列を' std :: array'で直接置き換える危険性について言及したいと思います。 (コピーされた)元のコードは生のポインタだけを渡します(おそらく意図的に配列のように見えるためです)。より良いアイデアはconst参照で渡すことです。 – VTT

+0

私はこれを見てください、あなたの答えをありがとう! – Matsmath

関連する問題