সি ++ এর পদ্ধতিতে কীভাবে optionচ্ছিক আর্গুমেন্টগুলি পাস করবেন?


112

সি ++ এর পদ্ধতিতে কীভাবে optionচ্ছিক আর্গুমেন্টগুলি পাস করবেন? কোনও কোড স্নিপেট ...


9
আপনি বিকল্পের পরামিতিগুলি পাস করেন না। আপনি alচ্ছিক যুক্তি পাস!
চুবসদাদ

সেন্ডিনেল মান সংরক্ষণ করে সরবরাহ করা তার চেয়ে আরও সুস্পষ্ট নিয়ন্ত্রণের জন্য, বুস্ট :: optionচ্ছিক <> দেখুন।
টনি ডেলরয়

উত্তর:


145

Modeচ্ছিক প্যারামিটার হিসাবে মোড পাস করার উদাহরণ এখানে

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

আপনি উভয় উপায়ে myfunc কল করতে পারেন এবং উভয়ই বৈধ

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

আপনি কি স্ট্রিং সম্পর্কিত কিছু উদাহরণ সরবরাহ করতে পারেন?
স্বপ্নিল গুপ্ত

অকার্যকর মাইফ্যাঙ্ক (ইন ব্লা, চর মোড [] =
এনইউএল

2
NULLএটি শাব্দিক হিসাবে সংজ্ঞায়িত করা হলেও একটি নাল পয়েন্টার অর্থ 0। ধ্রুব শূন্যের জন্য এটি সর্বজনীন নাম নয়। পূর্ণসংখ্যার (অ-পয়েন্টার) জন্য আপনি সংখ্যা ব্যবহার করা উচিত: int mode = 0
আঙ্কেলবেন্স

1
আপনি যদি কোনও শ্রেণীর (উত্স এবং শিরোনামের ফাইল) নিয়ে কাজ করছেন তবে আপনি ডিফল্ট মানটি কোথায় সংজ্ঞায়িত করবেন?
AceFunk

2
@ এসফঙ্ক সুপারটি দেরীতে আছে তবে আমি যে কোডটি দেখেছি তাতে শিরোনামে ডিফল্ট মান সংজ্ঞায়িত হয়েছে। আপনি যদি এটির বিষয়ে চিন্তা করেন, সিস্টেমটি জানত না যে উত্সটিতে alচ্ছিক সংজ্ঞা দেওয়া থাকলে আপনি মানটি বাদ দিতে পারেন
মঙ্গলবার

50

ডিফল্ট প্যারামিটার ব্যবহার সম্পর্কিত একটি গুরুত্বপূর্ণ নিয়ম:
ডিফল্ট প্যারামিটারগুলি বেশিরভাগ প্রান্তে নির্দিষ্ট করা উচিত, একবার আপনি যখন কোনও ডিফল্ট মান প্যারামিটার নির্দিষ্ট করেন আপনি আবার অ ডিফল্ট প্যারামিটার নির্দিষ্ট করতে পারবেন না। উদা:

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 

@ চুবসদাদ - আহ..আমার খারাপ দুর্বোধ্য বক্তব্য! দ্বিতীয় বিবৃতিটি এটির সঠিক পরিমাণে যুক্ত করে? "একবার আপনি কোনও ডিফল্ট মান প্যারামিটার নির্দিষ্ট করে দিলে আপনি আবার অ-ডিফল্ট প্যারামিটার নির্দিষ্ট করতে পারবেন না"
অলোক সেভ

1
সুতরাং যদি আমি সঠিকভাবে বুঝতে পারি আমার যদি একাধিক optionচ্ছিক পরামিতি থাকে তবে আমার উচিত হয় সেগুলি সমস্ত প্রয়োগ করা উচিত বা কিছুই নয়? আমি 1 টি alচ্ছিক প্যারামিটার ব্যবহার করতে বেছে নিতে পারি না তবে বাকিটা না?
জেরার্ড

@ জেরার্ড: "অনুমোদিত" উদাহরণটি একটি optionচ্ছিক প্যারামিটার দেখায় এবং বাকি ব্যবহারের ক্ষেত্রে এটি বৈধ নয়।
অলোক

4
আমি বুঝতে পারি, তবে আমার যদি int foo(int x, int y = 10, int z = 10)ফোন করতে এবং ফোন করতে চাই তবে কী হবে foo(1,2), তাই কেবলমাত্র একটি optionচ্ছিক পরামিতি দেওয়া। আমি নিজে এটি কাজ করতে সক্ষম হবে বলে মনে হয় নি।
জেরার্ড

30

আপনার কারও কাছে এটি আকর্ষণীয় হতে পারে যে একাধিক ডিফল্ট পরামিতিগুলির ক্ষেত্রে:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

নিম্নলিখিত ফাংশন কল দেওয়া:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

নিম্নলিখিত আউটপুট উত্পাদিত হয়:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

তথ্যসূত্র: http://www.learncpp.com/cpp-tutorial/77-default-paraters/


1
এই আমি খুঁজছিলাম ছিল। একটি ফাংশন ব্যবহার করুন যা বিভিন্ন সংখ্যক আর্গুমেন্ট পরিচালনা করতে পারে। হেডার ফাইলে ডিফল্ট মান সহ ফাংশন ঘোষণা করুন তারপরে এটি ডিফল্ট পরামিতি ছাড়াই সংজ্ঞায়িত করুন এবং তারপরে আপনি এটি ব্যবহার করতে পারবেন। ফাংশন ওভারলোড তৈরি করার প্রয়োজন নেই
তেহ সান লিউ

15

ডিফল্ট পরামিতি ব্যবহার করুন

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

দ্রষ্টব্য: নীচেরগুলি অ-গঠিত

template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )

সাধারণ সমাধানের জন্য ধন্যবাদ, আমি কোনও স্বেচ্ছাচারী ধরণের জন্য কীভাবে একটি ডিফল্ট মান প্রদান করতে হবে তা নির্ধারণ করার চেষ্টা করছিলাম।
বেনামে

13

এখানে বর্ণিত উদাহরণটি অনুসরণ করতে, তবে শিরোনাম ফাইলগুলির ব্যবহারের সাথে বাক্য গঠনটি পরিষ্কার করতে, ফাংশন ফরোয়ার্ড ঘোষণায় alচ্ছিক প্যারামিটারের ডিফল্ট মান থাকে।

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

10

কমাগুলি তাদের পৃথক করার সাথে সাথে ডিফল্ট মান ব্যতীত প্যারামিটারগুলির মতো।

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2

9

সাধারণত একটি প্যারামিটারের জন্য একটি ডিফল্ট মান সেট করে:

int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}

8

সি ++ 17 এ স্ট্যান্ড :: :: alচ্ছিক প্রবর্তনের সাথে সাথে আপনি alচ্ছিক আর্গুমেন্টগুলি পাস করতে পারবেন:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

আউটপুট:

id=first param=<parameter not set>
id=second param=something

Https://en.cppreferences.com/w/cpp/utility/optional দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.