Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Не е задължително, просто са примери.

Но, обикновено когато 2 метода правят едно и също нещо и параметрите им представляват едно и също нещо, като само типовете им се различават, е добра практика да кръстиш самите параметри по един и същи начин. Така при четене на кода после е по-ясно, че това е overload на метод с една и съща логика и едни и същи параметри, но за различни типове данни

0
gydigydi avatar gydigydi 12 Точки

Явно не ми е ясна задачата.

Според мен първата функция прави масив инт и вика втората функция която попълва масива инт с позициите на форматиращите символи и след връщането от нея гледа позициите в инт масив ги замества в стринга от стринг масива и вече тука има 2 масива с еднакви имена.

стринг и инт. Това ми е проблема.

 

На мен лично втората функция ми е съвсем излишна и усложнява кода.

0
31/03/2017 13:21:41
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Задачата е да направиш един клас, който приема един стринг, и после - като извикаш една от тези функции - замества в този стринг определени части с елементите от масивите. Функциите не правят никакви масиви, те приемат масиви. И класът се казва StringFormatter, съответно ще прави нещо свързано с формата на един стринг. Тоест класът прави нещо подобно на printf от C, а ако си писал примерно на C#, String.Format() прави нещо подобно, на Java също, на JavaScript също има подобен аналог, на PHP sprintf отново върши подобна работа.

Виж примера, който показва как се ползва обект от класа в задачата. Ако напишеш класа вярно, тогава примерния код трябва да даде точно резултатът, който е описан в  коментара.

string s = “Dear *:0, Our company *:1 wants to make you a Donation Of *:2 Million *:3 in good faith. Please send us a picture of your credit card”

StringFormatter formatter(s, “*:”);

formatter.format(new string[]{“Ben Dover”, “Totally Legit NonSpam Ltd”, “13”, “Leva”}, 4);

cout << s; //should print “Dear Ben Dover, Our company Totally Legit NonSpam Ltd wants to make you a Donation Of 13 Million Leva in good faith. Please send us a picture of your credit card” 

 

0
gydigydi avatar gydigydi 12 Точки

Това ми е ясно. Програмката ми работи с променено име на двата масива.

 

formatter.format(new string[]{“Ben Dover”, “Totally Legit NonSpam Ltd”, “13”, “Leva”}, 4);

formatter.format(new string[]{"Ben Dover", "Totally Legit NonSpam Ltd","13", "Leva"}, 4);

Това не ми работи, дава грешка и първо присвоявам на променлива и тогава подавам.

error: too many initializers for 'std::__cxx11::string [1] {aka std::__cxx11::basic_string<char> [1]}'|

 

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Да, сега видях, че съм написал параметъра java-style. Правилно си се сетил да го присвоиш на някаква променлива и след това да я подадеш:

string inserts[] = {"Ben Dover", "Totally Legit NonSpam Ltd", "13", "Leva"};
formatter.format(inserts, 4);

Така вече трябва да ти работи вярно - теб кое те притеснява в имената на параметрите? Името, с което е дефиниран параметъра във функцията не е нужно да съвпада с името на параметъра, с който се вика.

 

Edit: бях написал formatter.format(formats, 4); вместо formatter.format(inserts, 4);

Edit 2: и със стария синтаксис ще работи, но трябва да му кажеш размера на масива, който инициализираш:

new string[4]{"Ben Dover", "Totally Legit NonSpam Ltd", "13", "Leva"}

formatter.format(new string[4]{"Ben Dover", "Totally Legit NonSpam Ltd", "13", "Leva"}, 4);

... обаче това би оставило един масив в динамичната памет, който не е изтрит и му нямаме адреса - трябва или format метода да го изтрие като приключи (което е малко особено, защото масивът е инициализиран извън format, тоест по-скоро трябва да се изтрие също извън format), или да запазиш pointer към него (за да може после да го delete[]-неш) и да подадеш pointer-а на функцията, което възлиза на същия брой редове код

0
31/03/2017 15:46:08
v.krastev avatar v.krastev 54 Точки

и аз получих същата грешка за too many initalizers, както обяснява жоро се оправи.

въпросите са ми следните - 1. за какво е параметърът int insertArrSize който трябва да подаваме на двата format метода? предполагам не е проблем методите ми да не искат втори параметър освен масва, нали?

2.  фнкцията ми е следната (не използвам int insertArrSize, за това и не съм го ообявявал). самата функция си работи, търся помощ как да използвам двете полета от класа във метода му. 

void format(string insertArr[], string& stringToFormat, const string& formatPrefix)
    {
        short int counter = 0;
        string toFind = formatPrefix+to_string(counter);
        while(stringToFormat.find(toFind)!=string::npos)
        {
            stringToFormat.replace(stringToFormat.find(toFind), formatPrefix.size() + toFind.size() - 2, insertArr[counter]);
            counter++;
            toFind = formatPrefix+to_string(counter);
        }
    }

защо не мога да направя този метод без да се налага изобщо да подавам въпросните два параметъра отвън (както е по условие)? ако метода ми има само масива от стрингове за параметър, output-а не е никакъв, нищо не става. пробвах навсякъде пред    stringToFormat     и    formatPrefix    да сложа this->, пробвах this-> да го няма никъде, и в двата случая не се получава.... PS: stringToFormat     и    formatPrefix    са имената на полетата в класа ми, затова очаквах this-> да работи. обявил съм ги private и си ги въвеждам нормално с конструктор. нищо никъде не е константа и т.н. предложения от някого?

 

0
gydigydi avatar gydigydi 12 Точки

#include<iostream>
#include<string>

using namespace std;

class StringFormatter
{
    private:
    string formatPrefix;
    string *stringToFormat;
    public:
    StringFormatter(string& stringToFormat, const string& formatPrefix)
    {   this->stringToFormat=&stringToFormat;
        this->formatPrefix=formatPrefix;
    }
    public:
    void format(string insertArr[])
    {
        short int counter = 0;
        string toFind = formatPrefix+to_string(counter);
        while((*stringToFormat).find(toFind)!=string::npos)
        {
            (*stringToFormat).replace((*stringToFormat).find(toFind), formatPrefix.size() + toFind.size() - 2, insertArr[counter]);
            counter++;
            toFind = formatPrefix+to_string(counter);
        }
    }
}; //class
int main()
{
    string s = "Dear *:0, Our company *:1 wants to make you a Donation Of *:2 Million *:3 in good faith. Please send us a picture of your credit card";
    StringFormatter formatter(s, "*:");

    string p[4] {"Ben Dover", "Totally Legit NonSpam Ltd","13", "Leva"};
    formatter.format(p);

    cout<<s;
}

 

0
02/04/2017 06:12:25
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.