2012-11-17 29 views
12

मैं एक struct:प्रारंभ संरचना में खाली वेक्टर - C++

typedef struct user { 
    string username; 
    vector<unsigned char> userpassword; 
} user_t; 

मैं एक खाली vector साथ userpassword प्रारंभ करने की आवश्यकता:

struct user r={"",?}; 

क्या मैं के बजाय रखना चाहिए ??

+2

बस 'उपयोगकर्ता आर;' कहें। और 'typedef' अनावश्यक है। – chris

+0

@chris: इस तरह, userpassword में वैध शून्य-समाप्त सी स्ट्रिंग नहीं होगी। – SigTerm

+0

कोड केवल उदाहरण के लिए है ... और अधिक मूल्य होंगे, जिन्हें मुझे उचित मान – Tomasz

उत्तर

16

std::string और std::vector<T> दोनों वस्तुएं खाली होने के लिए प्रारंभ करने वाले निर्माता हैं। आप std::vector<unsigned char>() का उपयोग कर सकते हैं लेकिन मैं प्रारंभकर्ता को हटा दूंगा।

7

कैसे

के बारे में
user r = {"",{}}; 

या

user r = {"",{'\0'}}; 

या

user r = {"",std::vector<unsigned char>()}; 

या

user r; 
+1

पहली बार झुका नहीं था, तीसरा एक आकर्षण की तरह काम करता है :) धन्यवाद – Tomasz

+0

@ टोमाज़, पहला और दूसरा सी ++ 11 है। अंतिम तीसरे के समान है, लेकिन बहुत छोटा और अधिक पठनीय है। – chris

8

थी जैसा एस:

#include <string> 
#include <vector> 

struct user 
{ 
    std::string username; 
    std::vector<unsigned char> userpassword; 
}; 

int main() 
{ 
    user r; // r.username is "" and r.userpassword is empty 
    // ... 
} 
1

डिफ़ॉल्ट वेक्टर कन्स्ट्रक्टर एक खाली वेक्टर बना देगा। इस प्रकार, आपको लिखने में सक्षम होना चाहिए:

struct user r = { string(), vector<unsigned char>() }; 

नोट, मैंने "" के बजाय डिफ़ॉल्ट स्ट्रिंग कन्स्ट्रक्टर का भी उपयोग किया है। तब

class User { 
    User() {} 
    string username; 
    vector<unsigned char> password; 
}; 

सिर्फ लेखन:

आप उपयोगकर्ता एक वर्ग बनाने और एक डिफ़ॉल्ट निर्माता करता है जोड़ने पर विचार करने के लिए यह आपके लिए चाहते हो सकता है

User r; 

एक सही तरीके से प्रारंभ उपयोगकर्ता का परिणाम देगा।

+0

आपको डिफ़ॉल्ट कन्स्ट्रक्टर की भी आवश्यकता नहीं है। ओपी के पास अब जिस तरह से है, यह अभी भी वही काम करेगा। – chris

संबंधित मुद्दे