কোনও সি স্ট্রাক্টের যেমন কোনও ফাংশন ছিল তেমন আচরণ করা যায়?


13

আমি সি এবং structগুলি ব্যবহার করি যেখানে স্ট্রাক্টের সদস্য থাকতে পারে তবে কার্যকরী হয় না। সরলতা জন্য অনুমান যে আমি স্ট্রিং যে আমি নামের জন্য একটি struct তৈরি করতে চান strএবং আমি কাজ করতে সক্ষম হতে চান str.replace(int i, char c)যেখানে iস্ট্রিং এর সূচক এবং cচরিত্র অবস্থানে চরিত্র বদল হয় i। স্ট্রাক্টের কোনও কার্যকারিতা থাকতে পারে না বা এমন কিছু উপায় রয়েছে যা আমরা এই আচরণটি বাস্তবায়নের এবং নকল করতে পারি যে কোনও স্ট্রাক্টের (সরল) ফাংশন থাকতে পারে যা বাস্তবে কেবল স্ট্রাক্ট নিজেকে একটি নতুন কাঠামোতে অনুলিপি করে তার আপডেট করে না কেন এটি কখনও সম্ভব হবে না ক্ষেত্র, যা এটি করতে পারে?

সুতরাং replaceস্ট্রাক্টের তৃতীয় সদস্য হতে পারে যা কোনও নতুন স্ট্রাক্টকে নির্দেশ করে যা অ্যাক্সেস করা বা অনুরূপ হলে আপডেট হয়। এটা করা যেতে পারে? বা এমন কোনও বিল্টিন বা কিছু তত্ত্ব বা দৃষ্টান্ত রয়েছে যা আমার উদ্দেশ্যকে বাধা দেয়?

পটভূমিটি হ'ল আমি সি কোডটি লিখছি এবং আমি নিজেকে ফাংশনগুলি পুনরায় উদ্ভাবন করতে দেখি যা আমি জানি ওওপি ভাষাগুলিতে গ্রন্থাগার বিল্টইন এবং ওপিও স্ট্রিং এবং কমান্ডগুলি পরিচালনা করার জন্য একটি ভাল উপায়।


5
আমি সত্যই মনে করি আপনি এই ধরণের জিনিস করতে বিনামূল্যে ফাংশন লিখে ভাল হবে। তবে আপনার যদি প্রয়োজনীয় মক্সি থাকে তবে cs.rit.edu/~ats/books/ooc.pdf পড়ুন
রবার্ট হার্ভে

5
স্ট্রাক্টগুলিতে ভেরিয়েবলগুলি অন্তর্ভুক্ত থাকতে পারে যা ফাংশনগুলির জন্য নির্দেশক। উত্তরাধিকার হিসাবে নির্মিত নয় তবে আপনি একই কাঠামোর সাহায্যে বিভিন্ন ফাংশনের দিকে নির্দেশিত পয়েন্টারগুলির সাথে আপনার স্ট্রাক্ট ইনস্ট্যান্ট করতে পারেন। আপনি প্রায়শই ফাংশনটির প্রথম প্যারামিটারটি কাঠামোর একটি পয়েন্টার তৈরি করতে চান।
জেমস ম্যাকলিউড

29
(& str, i, c) প্রতিস্থাপন করা কি আসলেই স্ট্রিংরেপ্লেসের চেয়ে অনেক খারাপ (i, c)? আপনার প্রশ্নটি আসলে ফাংশনগুলি প্রতিস্থাপনের বিষয়ে নয়, এটি সিতে একটি নতুন সিনট্যাক্স ধুয়ে ফেলার চেষ্টা করা সম্পর্কে
যিনি হোস্টনাম

1
@ রবার্টহারভে cs.rit.edu/~ats/books/ooc.pdf লিঙ্কের জন্য ধন্যবাদ । চমৎকার বই (এবং দাম ঠিক আছে)।
জন ফোরকোশ

3
@ ওয়াটসিসনাম: সি-তে আপনাকে যে কোনও উপায়ে স্ট্রাকচার পয়েন্টারটি দিতে হবে, সুতরাং আপনি str.replace(&str, i, c)যেভাবেই শেষ করতে পারেন । সি ++ thisঅবশ্যই পয়েন্টারটি অতিক্রম করে ।
জোনাথন লেফলার

উত্তর:


21

আপনার ফাংশনটি দেখতে এমন হওয়া উচিত।

void
replace(struct string * s, int i, char c);

এটি প্রথম পরামিতি হিসাবে কাজ করতে অবজেক্টের একটি পয়েন্টার গ্রহণ করে। সি ++ এ এটি- thisপয়েন্টার হিসাবে পরিচিত এবং এটি স্পষ্টভাবে ঘোষণা করার দরকার নেই। (পাইথনের যেখানে এটি আছে তার সাথে এটি বৈপরীত্য করুন))

আপনার ফাংশনটি কল করার জন্য, আপনি সেই পয়েন্টারটি স্পষ্টভাবে পাসও করবেন। মূলত, আপনি o.f(…)সিনট্যাক্সের জন্য সিনট্যাক্স বাণিজ্য করেন f(&o, …)। তেমন কিছু না.

গল্পটি যদি আপনি বহুবিজ্ঞান (ওরফে virtualফাংশন) সমর্থন করতে চান তবে আরও জড়িত হয় । এটি সি-তে অনুকরণও করা যেতে পারে (আমি এটি এই উত্তরের জন্য দেখিয়েছি )) তবে হাতে হাতে করা ভাল নয়।

হিসাবে জানুয়ারী Hudec মন্তব্য করেছে, এছাড়াও আপনি এটা টাইপ নাম (যেমন সঙ্গে ফাংশন অনুসর্গ করার জন্য একটি অভ্যাস করা উচিত string_replace) যাতে সেখানে মাত্র নামে একজন একক কার্যকারিতা হতে পারে কারণ সি কোন নাম-স্পেস হয়েছে replace


17
অবশ্যই ফাংশনটি ডাকতে হবে string_replace, কারণ সিতে ফাংশন ওভারলোডিং নেই এবং আপনার অন্য replaceকোনও ধরণের জন্য অন্য কিছু থাকতে পারে ...
জানু হুডেক

2
নাম দেওয়া যায় না string_replace। শুরু নাম str, memবা wcsএকটি ছোট হাতের অক্ষর দ্বারা অনুসরণ ভবিষ্যৎ এক্সটেনশন জন্য সংরক্ষিত।
ডেভিড কনরাড

43

স্ট্রাক্টগুলি ফাংশন পয়েন্টার ধরে রাখতে পারে তবে সেগুলি কেবল ভার্চুয়াল পদ্ধতিগুলির জন্য প্রয়োজন। অবজেক্ট-ওরিয়েন্টেড সি-তে অ-ভার্চুয়াল পদ্ধতিগুলি সাধারণত নিয়মিত ফাংশনে প্রথম আর্গুমেন্ট হিসাবে কাঠামোটি পাস করে করা হয়। সি এর জন্য ওওপি ফ্রেমওয়ার্কের একটি ভাল উদাহরণের জন্য গবজেক্টের দিকে তাকান এটি উত্তরাধিকার এবং পলিমারফিজমের জন্য প্রয়োজনীয় প্রচুর বয়লারপ্লেট পরিচালনা করতে ম্যাক্রো ব্যবহার করে।

সি 44 বছর আগে তৈরি হয়েছিল। এটি উন্মুক্ত উত্সের জন্য একটি খুব জনপ্রিয় ভাষা। আপনি স্ট্যান্ডার্ড সি স্ট্রিংগুলি কাজ করার জন্য খালি বলে মনে করেন এমন প্রথম ব্যক্তি নন। সি স্ট্রিং লাইব্রেরির জন্য কিছু অনুসন্ধান করুন। আপনাকে চাকাটি পুনর্নির্মাণ করতে হবে না।


2
অন্যান্য উল্লেখযোগ্য উদাহরণ সিপিথন। কোডটি প্রচুর
ওওপি

@Bakuriu আমি মনে করি আপনি বিভ্রান্ত করছেন Cython এবং CPython
বিড়াল

1
@cat তিনি সম্ভবত পাইথন সি এপিআই মানে Cython না 100% বিশুদ্ধ সি docs.python.org/c-api/intro.html
Jab

5
@ ক্যাট নং সিপিথন উত্স দেখুন। বেশিরভাগ জিনিসগুলি সত্যই ওওপি দৃষ্টান্ত ব্যবহার করে সম্পন্ন হয় এবং এগুলি একটি ওওপি এপিআই সরবরাহ করে যা বেশিরভাগ অজগর এপিআইয়ের সাথে মেলে।
বাকুরিউ

1
@ বাকুরিউ ওহ, আপনার অর্থ পাইথনের রানটাইম, উত্স এবং সি এপিআই পাইথন ভাষা নয়। আপনার মন্তব্যটি খুব পরিষ্কার করে দেয়নি
বিড়াল

8

ফাংশন পয়েন্টার সহ, আপনি এটি করতে পারেন:

str.replace(&str, i, c);

এটি সাধারণত তখন কার্যকর হয় যদি বাস্তবায়ন পরিবর্তিত হতে পারে, এক্ষেত্রে আপনার একটি vtable ব্যবহার করা উচিত যাতে ওভারহেড প্রতি স্ট্রাক্টে কেবলমাত্র একটি পয়েন্টার থাকে:

str.vtable->replace(&str, i, c);

3
আমি এখনও এটিকে স্ট্রিং_রেপ্লেস (& str, i, c) হিসাবে কল করতে পারি তবে কল সাইটটি ভেটেবল সম্পর্কে জানার পরিবর্তে স্ট্রিং_রেপ্লেসের ভিতরে ভিটিবেল ব্যবহার করবে use
পিট কির্খাম

2
@ পিট নামগুলি str(বা memবা wcs) দিয়ে শুরু হয় এবং একটি ছোট হাতের অক্ষর ভবিষ্যতের এক্সটেনশনের জন্য সি স্ট্যান্ডার্ড দ্বারা সংরক্ষিত থাকে, সুতরাং এটি কল করবেন না string_replacestr_replaceভাল.
ডেভিড কনরাড

3

হ্যাঁ, তারা পারেন, সাজান। আপনি সিটি পয়েন্টারগুলিকে মেমরির ব্লক, অরফ ফাংশন পয়েন্টার ব্যবহারের অনুমতি দেয় এবং এটি ব্যবহার করে আপনি পলিমারফিজমের পাশাপাশি ভার্চুয়াল ফাংশনগুলির মতো ইন্টারফেস তৈরি করতে পারেন (এটি এমনকি সুন্দর না হলেও) use

আমি এই বিষয়ে একটি ব্লগ পোস্ট লিখেছিলাম, আমার শিক্ষার্থীদের একজনের প্রশ্নের পরে, সম্প্রতি, সি এবং গো-তে ইন্টারফেসের মতো কোড সম্পর্কিত, আপনি এটি এখানে পড়তে পারেন:

অ-ওও ইন্টারফেসে ব্লগ পোস্ট

এটি আপনাকে কোনও ধারণা দেয় কিনা দেখুন।

আপনি কেবল আপনার কোডটিতে একটি ফ্রি ফাংশন রাখতে পারেন এবং একটি "এই"-পয়েন্টার ব্যবহার করতে পারেন, যার অর্থ আপনি অন্যান্য উত্তরগুলিতে বর্ণিত হিসাবে কাজ করতে একটি বিদ্যমান স্ট্রাক্টকে একটি পয়েন্টারটি পাস করেন।

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