لماذا لا يمكنني استخدام أعضاء ثابت، على سبيل المثال هياكل ثابتة، في دروسي في VS2008؟

StackOverflow https://stackoverflow.com/questions/272161

سؤال

عند I كتابة التعليمات البرمجية مثل هذا في VS 2008:

.h
struct Patterns {
        string ptCreate;
        string ptDelete;
        string ptDrop;
        string ptUpdate;
        string ptInsert;
        string ptSelect;
    };     

class QueryValidate {
    string query;
    string pattern;
    static Patterns pts;
public:
    friend class Query;
    QueryValidate(const string& qr, const string& ptn):
      query(qr), pattern(ptn) {}
    bool validate() {
        boost::regex rg(pattern);
        return boost::regex_match(query, rg);
    }
    virtual ~QueryValidate() {}
};

وI ثم تهيئة بنية بلدي مثل هذا:

.cpp
string QueryValidate::pts::ptCreate = "something";
string QueryValidate::pts::ptDelete = "something";
//...

والمترجم يعطي الأخطاء التالية:

<اقتباس فقرة>   

'أنماط': الرمز إلى يسار "::" يجب أن يكون هناك نوع 'ptSelect "   : ليست عضوا في "QueryValidate '

وماذا أفعل الخطأ؟ هل هذه المشكلة مع Visual Studio أو مع قانون بلدي؟ وأنا أعلم أن أعضاء ثابتة باستثناء تلك CONST يجب أن تكون محددة خارج الطبقة كانوا أعلن في.

هل كانت مفيدة؟

المحلول

وأنت تحاول خلق عضوا غير ثابت (ptCreate) من عضو ثابت (نقطة). هذا لن يعمل مثل هذا.

هل حصلت على خيارين، إما استخدام قائمة البنية مهيئ للطبقة الأنماط.

Patterns QueryValidate::pts = {"CREATE", "DELETE"}; // etc. for every string

وأو أكثر أمانا بكثير (وأفضل في رأيي)، وتوفير منشئ في أنماط وندعو ان واحد.

struct Patterns {
   Patterns() { /*...*/ }
   /* ... */
}

في الجانب لا، فإن الشفرة لا تعمل في أي C ++ مترجم، انها ليست صراع مع ستوديو الأشياء البصرية.

نصائح أخرى

ويمكنك تهيئة فقط الهيكل ككل، كما في:

Patterns QueryValidate::pts = { "something", "something", ... };

وهذا غير صحيح C ++. في ملف حزب الشعب الكمبودي كنت أنت معلنا أجزاء من هيكل ثابت "QueryValidate :: نقطة"، ولكن هذا لا يسمح: كنت قد حصلت على اعلان الهيكل كله، كما يلي:

وأنماط QueryValidate :: نقطة؛

وإذا كنت تريد الأعضاء للتهيئة، إما تهيئة لهم في طريقة أخرى، أو إضافة المنشئ للأنماط التي تأخذ أيا كان الحجج التهيئة التي تريدها.

ولست متأكدا من حقيقة ما تحاول القيام به هنا. يبدو وكأنه نوع من تحاول أن يعلن وتهيئة كل حقل في نقطة على حدة، بدلا من إعلان نقطة مرة واحدة ككائن واحد. أنا مندهش حقا VS يتيح لك القيام بذلك.

وماذا عملت بالنسبة لي في دول مجلس التعاون الخليجي كان ما يلي:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top